{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Chapter 6 – Decision Trees**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "_This notebook contains all the sample code and solutions to the exercises in chapter 6._"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<table align=\"left\">\n",
    "  <td>\n",
    "    <a href=\"https://colab.research.google.com/github/ageron/handson-ml3/blob/main/06_decision_trees.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>\n",
    "  </td>\n",
    "  <td>\n",
    "    <a target=\"_blank\" href=\"https://kaggle.com/kernels/welcome?src=https://github.com/ageron/handson-ml3/blob/main/06_decision_trees.ipynb\"><img src=\"https://kaggle.com/static/images/open-in-kaggle.svg\" /></a>\n",
    "  </td>\n",
    "</table>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "tags": []
   },
   "source": [
    "# Setup"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This project requires Python 3.7 or above:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "\n",
    "assert sys.version_info >= (3, 7)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It also requires Scikit-Learn ≥ 1.0.1:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from packaging import version\n",
    "import sklearn\n",
    "\n",
    "assert version.parse(sklearn.__version__) >= version.parse(\"1.0.1\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As we did in previous chapters, let's define the default font sizes to make the figures prettier:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.rc('font', size=14)\n",
    "plt.rc('axes', labelsize=14, titlesize=14)\n",
    "plt.rc('legend', fontsize=14)\n",
    "plt.rc('xtick', labelsize=10)\n",
    "plt.rc('ytick', labelsize=10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And let's create the `images/decision_trees` folder (if it doesn't already exist), and define the `save_fig()` function which is used through this notebook to save the figures in high-res for the book:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from pathlib import Path\n",
    "\n",
    "IMAGES_PATH = Path() / \"images\" / \"decision_trees\"\n",
    "IMAGES_PATH.mkdir(parents=True, exist_ok=True)\n",
    "\n",
    "def save_fig(fig_id, tight_layout=True, fig_extension=\"png\", resolution=300):\n",
    "    path = IMAGES_PATH / f\"{fig_id}.{fig_extension}\"\n",
    "    if tight_layout:\n",
    "        plt.tight_layout()\n",
    "    plt.savefig(path, format=fig_extension, dpi=resolution)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Training and Visualizing a Decision Tree"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DecisionTreeClassifier(max_depth=2, random_state=42)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.datasets import load_iris\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "\n",
    "iris = load_iris(as_frame=True)\n",
    "X_iris = iris.data[[\"petal length (cm)\", \"petal width (cm)\"]].values\n",
    "y_iris = iris.target\n",
    "\n",
    "tree_clf = DecisionTreeClassifier(max_depth=2, random_state=42)\n",
    "tree_clf.fit(X_iris, y_iris)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**This code example generates Figure 6–1. Iris Decision Tree:**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.tree import export_graphviz\n",
    "\n",
    "export_graphviz(\n",
    "        tree_clf,\n",
    "        out_file=str(IMAGES_PATH / \"iris_tree.dot\"),  # path differs in the book\n",
    "        feature_names=[\"petal length (cm)\", \"petal width (cm)\"],\n",
    "        class_names=iris.target_names,\n",
    "        rounded=True,\n",
    "        filled=True\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.49.1 (0)\n",
       " -->\n",
       "<!-- Title: Tree Pages: 1 -->\n",
       "<svg width=\"360pt\" height=\"314pt\"\n",
       " viewBox=\"0.00 0.00 360.00 314.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 310)\">\n",
       "<title>Tree</title>\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-310 356,-310 356,4 -4,4\"/>\n",
       "<!-- 0 -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>0</title>\n",
       "<path fill=\"#ffffff\" stroke=\"black\" d=\"M215,-306C215,-306 67,-306 67,-306 61,-306 55,-300 55,-294 55,-294 55,-235 55,-235 55,-229 61,-223 67,-223 67,-223 215,-223 215,-223 221,-223 227,-229 227,-235 227,-235 227,-294 227,-294 227,-300 221,-306 215,-306\"/>\n",
       "<text text-anchor=\"middle\" x=\"141\" y=\"-290.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">petal length (cm) &lt;= 2.45</text>\n",
       "<text text-anchor=\"middle\" x=\"141\" y=\"-275.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.667</text>\n",
       "<text text-anchor=\"middle\" x=\"141\" y=\"-260.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 150</text>\n",
       "<text text-anchor=\"middle\" x=\"141\" y=\"-245.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [50, 50, 50]</text>\n",
       "<text text-anchor=\"middle\" x=\"141\" y=\"-230.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = setosa</text>\n",
       "</g>\n",
       "<!-- 1 -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>1</title>\n",
       "<path fill=\"#e58139\" stroke=\"black\" d=\"M108,-179.5C108,-179.5 12,-179.5 12,-179.5 6,-179.5 0,-173.5 0,-167.5 0,-167.5 0,-123.5 0,-123.5 0,-117.5 6,-111.5 12,-111.5 12,-111.5 108,-111.5 108,-111.5 114,-111.5 120,-117.5 120,-123.5 120,-123.5 120,-167.5 120,-167.5 120,-173.5 114,-179.5 108,-179.5\"/>\n",
       "<text text-anchor=\"middle\" x=\"60\" y=\"-164.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.0</text>\n",
       "<text text-anchor=\"middle\" x=\"60\" y=\"-149.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 50</text>\n",
       "<text text-anchor=\"middle\" x=\"60\" y=\"-134.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [50, 0, 0]</text>\n",
       "<text text-anchor=\"middle\" x=\"60\" y=\"-119.3\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = setosa</text>\n",
       "</g>\n",
       "<!-- 0&#45;&gt;1 -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>0&#45;&gt;1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M112.9,-222.91C105.11,-211.65 96.64,-199.42 88.8,-188.11\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"91.53,-185.9 82.96,-179.67 85.78,-189.88 91.53,-185.9\"/>\n",
       "<text text-anchor=\"middle\" x=\"78.49\" y=\"-200.56\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">True</text>\n",
       "</g>\n",
       "<!-- 2 -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>2</title>\n",
       "<path fill=\"#ffffff\" stroke=\"black\" d=\"M293.5,-187C293.5,-187 150.5,-187 150.5,-187 144.5,-187 138.5,-181 138.5,-175 138.5,-175 138.5,-116 138.5,-116 138.5,-110 144.5,-104 150.5,-104 150.5,-104 293.5,-104 293.5,-104 299.5,-104 305.5,-110 305.5,-116 305.5,-116 305.5,-175 305.5,-175 305.5,-181 299.5,-187 293.5,-187\"/>\n",
       "<text text-anchor=\"middle\" x=\"222\" y=\"-171.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">petal width (cm) &lt;= 1.75</text>\n",
       "<text text-anchor=\"middle\" x=\"222\" y=\"-156.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.5</text>\n",
       "<text text-anchor=\"middle\" x=\"222\" y=\"-141.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 100</text>\n",
       "<text text-anchor=\"middle\" x=\"222\" y=\"-126.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 50, 50]</text>\n",
       "<text text-anchor=\"middle\" x=\"222\" y=\"-111.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = versicolor</text>\n",
       "</g>\n",
       "<!-- 0&#45;&gt;2 -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>0&#45;&gt;2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M169.1,-222.91C175.26,-214.01 181.84,-204.51 188.19,-195.33\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"191.13,-197.24 193.95,-187.02 185.38,-193.25 191.13,-197.24\"/>\n",
       "<text text-anchor=\"middle\" x=\"198.42\" y=\"-207.92\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">False</text>\n",
       "</g>\n",
       "<!-- 3 -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>3</title>\n",
       "<path fill=\"#4de88e\" stroke=\"black\" d=\"M202,-68C202,-68 102,-68 102,-68 96,-68 90,-62 90,-56 90,-56 90,-12 90,-12 90,-6 96,0 102,0 102,0 202,0 202,0 208,0 214,-6 214,-12 214,-12 214,-56 214,-56 214,-62 208,-68 202,-68\"/>\n",
       "<text text-anchor=\"middle\" x=\"152\" y=\"-52.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.168</text>\n",
       "<text text-anchor=\"middle\" x=\"152\" y=\"-37.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 54</text>\n",
       "<text text-anchor=\"middle\" x=\"152\" y=\"-22.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 49, 5]</text>\n",
       "<text text-anchor=\"middle\" x=\"152\" y=\"-7.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = versicolor</text>\n",
       "</g>\n",
       "<!-- 2&#45;&gt;3 -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>2&#45;&gt;3</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M195.93,-103.73C190.34,-94.97 184.41,-85.7 178.79,-76.91\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"181.62,-74.84 173.29,-68.3 175.72,-78.61 181.62,-74.84\"/>\n",
       "</g>\n",
       "<!-- 4 -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>4</title>\n",
       "<path fill=\"#843de6\" stroke=\"black\" d=\"M340,-68C340,-68 244,-68 244,-68 238,-68 232,-62 232,-56 232,-56 232,-12 232,-12 232,-6 238,0 244,0 244,0 340,0 340,0 346,0 352,-6 352,-12 352,-12 352,-56 352,-56 352,-62 346,-68 340,-68\"/>\n",
       "<text text-anchor=\"middle\" x=\"292\" y=\"-52.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">gini = 0.043</text>\n",
       "<text text-anchor=\"middle\" x=\"292\" y=\"-37.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 46</text>\n",
       "<text text-anchor=\"middle\" x=\"292\" y=\"-22.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = [0, 1, 45]</text>\n",
       "<text text-anchor=\"middle\" x=\"292\" y=\"-7.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">class = virginica</text>\n",
       "</g>\n",
       "<!-- 2&#45;&gt;4 -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>2&#45;&gt;4</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M248.07,-103.73C253.66,-94.97 259.59,-85.7 265.21,-76.91\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"268.28,-78.61 270.71,-68.3 262.38,-74.84 268.28,-78.61\"/>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<graphviz.files.Source at 0x7fbfb8e45850>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from graphviz import Source\n",
    "\n",
    "Source.from_file(IMAGES_PATH / \"iris_tree.dot\")  # path differs in the book"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Graphviz also provides the `dot` command line tool to convert `.dot` files to a variety of formats. The following command converts the dot file to a png image:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# extra code\n",
    "!dot -Tpng {IMAGES_PATH / \"iris_tree.dot\"} -o {IMAGES_PATH / \"iris_tree.png\"}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Making Predictions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# extra code – just formatting details\n",
    "from matplotlib.colors import ListedColormap\n",
    "custom_cmap = ListedColormap(['#fafab0', '#9898ff', '#a0faa0'])\n",
    "plt.figure(figsize=(8, 4))\n",
    "\n",
    "lengths, widths = np.meshgrid(np.linspace(0, 7.2, 100), np.linspace(0, 3, 100))\n",
    "X_iris_all = np.c_[lengths.ravel(), widths.ravel()]\n",
    "y_pred = tree_clf.predict(X_iris_all).reshape(lengths.shape)\n",
    "plt.contourf(lengths, widths, y_pred, alpha=0.3, cmap=custom_cmap)\n",
    "for idx, (name, style) in enumerate(zip(iris.target_names, (\"yo\", \"bs\", \"g^\"))):\n",
    "    plt.plot(X_iris[:, 0][y_iris == idx], X_iris[:, 1][y_iris == idx],\n",
    "             style, label=f\"Iris {name}\")\n",
    "\n",
    "# extra code – this section beautifies and saves Figure 6–2\n",
    "tree_clf_deeper = DecisionTreeClassifier(max_depth=3, random_state=42)\n",
    "tree_clf_deeper.fit(X_iris, y_iris)\n",
    "th0, th1, th2a, th2b = tree_clf_deeper.tree_.threshold[[0, 2, 3, 6]]\n",
    "plt.xlabel(\"Petal length (cm)\")\n",
    "plt.ylabel(\"Petal width (cm)\")\n",
    "plt.plot([th0, th0], [0, 3], \"k-\", linewidth=2)\n",
    "plt.plot([th0, 7.2], [th1, th1], \"k--\", linewidth=2)\n",
    "plt.plot([th2a, th2a], [0, th1], \"k:\", linewidth=2)\n",
    "plt.plot([th2b, th2b], [th1, 3], \"k:\", linewidth=2)\n",
    "plt.text(th0 - 0.05, 1.0, \"Depth=0\", horizontalalignment=\"right\", fontsize=15)\n",
    "plt.text(3.2, th1 + 0.02, \"Depth=1\", verticalalignment=\"bottom\", fontsize=13)\n",
    "plt.text(th2a + 0.05, 0.5, \"(Depth=2)\", fontsize=11)\n",
    "plt.axis([0, 7.2, 0, 3])\n",
    "plt.legend()\n",
    "save_fig(\"decision_tree_decision_boundaries_plot\")\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can access the tree structure via the `tree_` attribute:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<sklearn.tree._tree.Tree at 0x7fbfa8b563b0>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree_clf.tree_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For more information, check out this class's documentation:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "# help(sklearn.tree._tree.Tree)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "See the extra material section below for an example."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Estimating Class Probabilities"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.   , 0.907, 0.093]])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree_clf.predict_proba([[5, 1.5]]).round(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1])"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree_clf.predict([[5, 1.5]])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Regularization Hyperparameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DecisionTreeClassifier(min_samples_leaf=5, random_state=42)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.datasets import make_moons\n",
    "\n",
    "X_moons, y_moons = make_moons(n_samples=150, noise=0.2, random_state=42)\n",
    "\n",
    "tree_clf1 = DecisionTreeClassifier(random_state=42)\n",
    "tree_clf2 = DecisionTreeClassifier(min_samples_leaf=5, random_state=42)\n",
    "tree_clf1.fit(X_moons, y_moons)\n",
    "tree_clf2.fit(X_moons, y_moons)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsAAAAEQCAYAAAC++cJdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABO50lEQVR4nO3deZxcVZ3//9eneskeAiH7AoQkELYEyLBGgQlRQBHE3cHRcWGcUX8u48zPr+jg6He+MsNXXH6KCl9xnZGvS2QNS4IGjKBkbRISyEZCICELpLd0eqs6vz+qqlNdXXvdqntv1fv5ePSju6tu3XvqVtX7njr3nHPNOYeIiIiISL2I+F0AEREREZFqUgVYREREROqKKsAiIiIiUldUARYRERGRuqIKsIiIiIjUFVWARURERKSuqAIs4hEz+5CZdZa5jsvNzJnZiV6VS0SCKfFZf6ff5ag0M/uJmT0Y5m2Z2U1m9pKZxczsK16vX6pPFWCpmkQwOTP7Utrtga30mdlKM/tugYv/X2BWEeveZWafT7v5KWAK8Fqh6xGR0JoCPOB3ISQ3Mzse+B5wGzAN+N8V2s5XEsfC1J9XK7EtUQVYqq8b+Bczm1DpDZlZU6W3kbot59xR59yBctbjnOt1zr3qdIUakZqX+Kz3+F0OyeskoBF40Dm3zzlX1pm+PF4g/sUo+XN2BbdV11QBlmr7A7AL+HKuhczsjWb2FzPrNrP9ZvZNM2vOsXyyFfkaM3vGzHqBN1vcv5jZDjM7amYbzezGtMf+q5ntNrMeM3vVzH6WuP0nwGXAJ1K+jZ+cY1tDukCY2VsSz+Oomb1mZg+Y2XAzW0k8VG9LrjvteZyYso4bEuXuMbM9ZnazmVnK/bvM7Etm9kMzazezl83sn9PK8fdmtjWxPw+a2aNm1pjrNRCRwiTOFH3fzL5hZq8nPmOfNrNhZvY9M2tNnD7/QNrjBrpAJLLFmdk7zGy5mXWZ2WYzW1JgGZrM7DtmtjclK25Nuf9GM1ttZh1mdsDMfm1m01LuT2bP1Wa2NpFZfzSz6WZ2mZm1mFmnmT1oZuNTHveTxG1fSmR1p5n92MxG5ChryblcrAK3dauZvZC4f5eZ/aeZDU/c9yFgfWLRncnjQCllKVB/4otR8udgBbdV35xz+tFPVX6AnwAPAtcAvcCpidsvBxxwYuL/acAR4AfAPOCtwKvAN3KsO7mOjcCbiHdFmAD8O/Fv1FcBpwDvT6z7LYnHvQNoB94CzAQWAp9M3Hcc8S4JdwOTEz8NObb1IaAzpUxXAf3A/wTOAM4BPg+MBE4A9gD/llx3ln1xPhBNLDcX+BugE/hUynZ2Ee8y8UlgNvCpxDouTty/MFGOvyFe6Z4PfBZo9Ps9oR/91MIPsDKRI18B5gD/lPgMPgx8OvG5/BrQA0xNeZwD3pn4++TE/88D1ybW89PEZ3t0AWX4p0SmvDGRZZcAf5dy/4eJZ+8s4ALijRFPptyfzJ5ngDck8moT8CfgceDCRJa8CPx/KY/7CdAB/Bo4C3gz8ArwnbRlHkz5v+RcLmA/FLWtxDJfBi5NvAbXAC8BX0vcNyLxnBzwVySOA1m2/TDxfM76k6fsXwG6EvvvReAeYJbf7+9a/fG9APqpn5/UYEqE7z2Jv5PBm6z0/TuwHYikPPZDxA8eI7OsO7mOd6TcNgo4CrwhbdlvAcsSf38uEY5NWda7Evhuvm2llDG1Avyn5HPMsu5dwOezrDu5L/4L+H3aMl8BXk5bzy/TltkGfCnx9w1AGzDG7/eAfvRTiz+JnHg65X8DDgL3p9zWRPyL/ztTbstUAf77lPunJW5bVEAZvkO8omoFlvn0xLqnJ/5PZs+bU5b5ZOK281Ju+wqwKeX/nwCtpFTSgRsTeT0qZZlk9pedy3meV1HbyrKOjwPbU/5fmNgPJ+fZ9jTiX3ay/uR5/NXAu4l/+bgy8b56FRjv93u8Fn90ClT88i/An80s02CCecQPJrGU21YBzcRD5Nkc612T8vcZwHDgkWQXg4Qm4pVGiLdafBp40cweBR4hftAqpF/emjz3n0s8jMsxD3go7bZVwC1mNtY51564LX2f7AUmJv5eDuzm2HN8DFjqnOsos2wicszAZ9A558zsAPGzRMnb+szsMMc+l3nXQ/xzTAGPgXjWLAe2mtljwDLg4WSOmtl5wC3AAuJnoJLdqGYCL2fZ/v7E741pt6WX51k3uF/s08Tz+lSGZlOlc7nYbZHohvIZ4seX0cTP9DUUuS2cc68U+5i0xz+c+r+Z/RnYCXwQuL2cdctQ6gMsvnDOrQZ+C/xHhruN+LftjA/Ns+ojKX8n39/XEg/95M+ZxLsu4JzbA5wG/D3xU27fANaa2ag820nfVqUUui/6MtwXAUhUdM8j3rLwEvA/gOfNbKq3RRWpa5k+g1k/l4WsxyWaBQt4DM65dcRbkb+YWP6nwHIziyTy7FHip9c/QPxU/lWJh6aPrUgts0usO/22cuoOlc7lorZlZhcR72rwaGK5c4EvEa8kF8XMHk70gc76U8z6El8qniPeHUY8phZg8dMXgc0cC+KkzcC7zSyS0gq8iPjpwx1FrH8z8dNwJznnfp9tIedcN/FW1ocSg0ZeJd4f7LHENotuCUhYDywG7spyfyHr3kz8uadaRLwLRMEtuM65fuD3wO/N7BbgAPG+1XcWug4RCbZEJvwa+LXFB/H+mXir5hjgROCLzrkXIT641sNNn21mo5xzyUaBi8ie117kcqEK2dalwCvOua8lbzCzk4rYRqqPEu8z7InEQLzTiXcZFI+pAiy+cc5tN7M7iZ/qSnUH8dNRd5jZt4kP2riVeF/criLW35HoYvG/zcyAJ4mf3roIiDnn7kyM8G0E/kJ8kMJ7iLeAbEusZhdwQWLUbyfwehFP8d+BB8xsO/DfxFtz3wT8MPE8dgFvMLNfAD3OuUMZ1vENYLXFJ17/b+ItN/9E/MtDQczsrcRPRT6ZKP8VxA+IW4p4LiISYGb2OWAfsIF4hr2feOvpy8T7wvYAnzSz7xHvWvW1zGsqSSNwt5l9FZhKPK/vSqkQD/AolwtSyLaArcA0M/sb4l033gy8r9gdkNheWV0gEmV9gPiZuonEB+eNIt6aLx5TFwjx21eJz1AwIBEiVxM/FbWB+CwMv6SISl+KLxMftPF54qeSlhMfYfxi4v5W4CPAH4mPeH4HcEOylYT4hOe9xFsSDhLvL1cQ59wy4O2J57IeeIJ45TPZqv2vwAzirSQZp7pJnNZ8V6Jcm4gfWG4FCr04B8Sf4/XACuIjzD8PfNQ598ci1iEiwdYB/DPxWRzWET/Vf7VzrsvFp9L6IPEc2Ey8L/DnPNz2E8Tz9Q/A74ifbfqXHMuXm8vFyLkt59wDxC9w8S3i/ZWXEM9mP0wnfqx7AVhK/EvLRc653T6Vp6bZsS5GIiIiIoVLdLU40Tn3Vr/LIlIMtQCLiIiISF3xpQJsZncnrkSzKcv9l5tZm5ltSPz4dTpCRETEd2b2gxyzC/zA7/JVg5nNzDPLQsFd1ER86QJhZm8k3rH9Z865szLcfznxCwTolIqIiNQ9M5sIjM1yd7tz7kA1y+MHi1++/eQci+xKzHgjkpcvs0A4556s8LW0RUREakaiglvzldxcEpXb7X6XQ2pDkPsAX2xmLYmJpc/0uzAiIiIiUhuCOg/wOuITV3ea2TXAvWS5EoqZ3QTcBDBq1IjzTzv95GqVUUTK0kxPdx9tbW20tbUxasQwpk083u9CBcraTdsPOecmVGr9yk+REHNNdHf30draRnt7G8ePHcXEE7L1kqlPuTLUt2nQEl0gHszUBzjDsruAhVkuFDDg/IVnuKef+S9vCigiFWVuBju27eehBx/i4WXLOG/eDP7js+/2u1iBEpnztrXOuYXV2JbyUyRkotPYsvll7r//AZY/9ig3LD6PT9/4Zr9LFSi5MjSQXSDMbHLiqi2Y2QXEy/mav6USERERkVrgSxcIM/slcDlwopm9TPyqNE0AzrkfAO8E/sHM+oGjwHudrtgRai0btvD48lW0tXZw3LgxLF6yiPkL5vldLBGRUFCGinjLr1kgcl5n2zn3XYq71KsEWMuGLTxw73L6+uKz07S1dvDAvcsBFOAiInkoQ0W8F8guEFJbHl++aiC4k/r6+nl8+SqfSiQiEh7KUBHvqQIsFdfW2lHU7SIicowyVMR7qgBLxR03bkxRt4uIyDHKUBHvqQIsFbd4ySKamgZ3N29qamTxkkU+lUhEJDyUoSLeC+qFMKSGJAdpaASziEjxlKEi3lMFWKpi/oJ5CmsRkRIpQ0W8pS4QIiIiIlJX1AIsWWnidRGR0ilDRYJLFWDJSBOvi4iUThkqEmyqAEtGuSZeLyW81RIiIvXEywxVfop4TxVgycjLidfVEiIi9carDFV+ilSGBsFJRl5OvK7LeIpIvfEqQ5WfIpWhCrBk5OXE67qMp4jUG68yVPkpUhnqAiEZeTnx+nHjxmQMa13GU0RqlVcZqvwUqQxVgCUrryZeX7xk0aA+bKDLeIpI7fMiQ5WfIpWhCrBUXBgu46lR1iISRGHIT1CGSvioAixVEeTLeGqUtYgEWZDzE5ShEk4aBCd1T6OsRURKpwyVMFIFWOqeRlmLiJROGSphpAqw1D0v5zwWEak3ylAJI1WApe55OeexiEi9UYZKGGkQnIReuaOPwzLKWkSkEpShUo9UAZZQ82r0cdBHWYuIVIIyVOqVukBIqGn0sYhI6ZShUq9UAZZQ0+hjEZHSKUOlXqkCLKGm0cciIqVThkq9Uh9gCaxCBmYsXrJoUP81KGz0sS7bKSK1Thkqkp0qwBJIhQ7MKGX0sS7bKSK1ThkqkpsqwBJIuQZmpAdssaOPi1m3iEgYKUNFclMfYAmkSg7M0KAPEal1ylCR3NQCLIF03LgxGcPUi4EZ2dYN8VN7frRgqD+diHhJGaoMldzUAiyBVMlLa+Zahx9zXyb70yUPKMn+dC0btlS9LCJSG5ShylDJzZcKsJndbWYHzGxTlvvNzL5jZtvN7FkzO6/aZRR/zV8wj2uvXzLQWnHcuDFce/0ST77R51qHH6fwNBG9iHhNGaoMldz86gLxE+C7wM+y3H81MCfxcyHw/cRvqSOVvLSml6cHyz31pv50IlIJylBlqGTnSwXYOfekmZ2cY5HrgJ855xzwZzMbZ2ZTnHP7qlNCqXWlzn2ZzovpgIo5kKifm4gEgTJUwi6ofYCnAXtS/n85cZuIJ7w6PejFqbdC++qpn5uIBIUyVMIuqLNAWIbbXMYFzW4CbgKYOXNyJctUs+r1G7EXpwe9OPVW6ET0mntTvKb89IYytHTKUPFLUCvALwMzUv6fDuzNtKBz7k7gToDzF56RsZIs2ZVy+qlewz4Tr/rBFXIgUT838Zrys3zFZqjyczBlqPglqBXg+4FPmtk9xAe/tan/b2UU+424ni6BWciBqtB+cF4c9Co5r6eIlKaYDK2n/ARlqASbLxVgM/slcDlwopm9DNwCNAE4534ALAOuAbYDXcDf+VHOoKhki0Gx34j9PoWUui/MDOdcRVpRCj1QFXLqzauDnleDTkTqTVAy1O/8BGWoMlSS/JoF4n157nfAJ6pUnECrdItBsd+IvTqFVMoBKX1fxN8m3u+Tlg1b+N1vHhlYf1K2A1W+U29eHfQK7ecmIscEKUO9PAWvDFWGSnmC2gVCEirdYlDsN2IvTiGVekDKtC+SvNonybKlB3dSKQcqLw96lZzXU6QWBSlDvToFrwwtfV3KUElSBTjgvPjgZ2opgGPfgkeMHE5jYwNHj/bk/UbsxSmkUg9I+Z6zFwMZch0goLS+Yup3JuKfIGWoV6fglaGlr0skSRXggCv3g5+ppeC+pY/inCMWi39DP9rVTVNTIze86+q834y9OIVU6gEp275IGjFiWMFlyCbX+kvtK5btoDdn7incfttdOhVXR3q72tn6xC+Ye9mNNI8c63dx6kKQMtSrU/DKUGVovfIyQ4N6IQxJKHSC72wyfRuPRmMDwZ1UzeumZzvw5DsgZdoXqXp7+4qa0LxlwxZuv+0ubrn5dm6/7S5aNmzJWgYzK2mSd8g8Yfz8c8+gZf1mTcheJ3q72tn08B3sWruM9v272NOywu8i1Y2gZej8BfNYvGTRQGX08eWriv7cK0OVofWmEhmqFuCAK7fFoJhTWm2tHdxy8+05t+HFgJJSTwOm74t00Wis4D5s2Z5HMlTTy1ZqcKeWPfXxt992l++jwaV69rSsoH3/Lti/C3Ac3L6GGfOvVCtwFShDj1GGSlhVIkNVAQ6Bcjrt5zvllUmuQPZiQEm2AxKQ93RWcl/ccvPtWcteiGzPY9vWF7n2+iUlHywLHZmtCdnrR29XOwe2ryb1YpbOxdjTsoJTL77Bv4LVEWXo4McqQyVMKpWhqgDXoNQAGTFyOJGIDTpd19AQGdR/LZNsgexV6KQfkIptFSm3X1+u51HqwbKY56BBHfVjT8sKSBsR72JRtQIHmDI0P2WoVEulMlR9gGtMMkCSwXC0qxszGxjccNy4MVx3w5u5/h1X5Q2KYsKl3NDJ1SqSSbn9+irxPB5+8PcFP4dyyy/hkGy5cLHokPuSLRgSLMpQfzI0OXewMlRSVTJD1QJcY7IN2Gge1swXvjT42iLJb9TJU2bpMgVZpr5nAHPmnlJWuYttFSm3X5/XVwRq2bCFo0d7Mt6X6TloQvb6kKnlIsnFonQc2F3lEkk+ytDqZ2gpcwcrQ+tDJTNUFeAaU8rptWKCbP6Ceby0+xXWPPPsoNtb1m9m5knTPO9nl6s1oZx+fV6HZ67R39megyZkr30dB3ZnbLkYefxUFlz3WR9KJPkoQwvjZYaWOnewMrT2VTJDVQGuMdlCcMTI4VkfU2yQbdv64pDbyh1968c12r0Mz3wHR6lPquSGjzK0cF5laCXmDpbaUMkMVQW4xixesoj7lj5KNBobdHtPdw8tG7ZkDatigqwSo2/Dfjor10EzLM9BRJShfsiWn+XMHSySjyrANWb+gnk8/ODvh/RHjcWcZ/MjVmr0bZhPZ2Vrfbn6LVf4WCoRKZYytPqy5acqv1JJtVUBds0QneF3KXyXczCWB/tn8eK38cD9v6Kvr2/gtqamJhYvfltB6+/tOMSO397C7Hd+labR48suTxDMP3sGxE7g8RXLaGs7zHHHHc/iK69h/tkLYWj3JQFisSai0Sh9/f3EYrH8DxCpkmIGtJainO4KvR2H2fGr7zD73Z+macw4T8rjtzC3Xkt41VQFuL29k0cfecrvYvhu2LCR9PR0Zbzdq/1z8snn8tJLm+jp6WLYsJHMnHkWr+7r5dV9+dc/8sWlDDvwLH/++a10nfJ2T8oTFGeeeeXA34Xuj3oVi8VYu3YdTz/9NN3d3cydOcnvIokAlZ9jtpwK396VS+l86QVeWbmUk6/9sCflCYKwtl5LeNVUBfjVV/fzjW9kvrpNPRk/fiSnnno8DQ3HpnmORmNs3LiHlSsrtX9eKGipMU1R/mnhQawBGvY9zQ8f2E5nX0NJWzSgsakJK+GxsViM/v7so46lOrp7uhnZHOFzH7yaty8+z+/iiADVGVBWSoWvt+Mwh9Y/Ac5xaP0TTLv8hpppBRaptpqqAEejUQ4fPux3McoyZco4TjttMiNGNHH0aB8vvPAq+/a1FrWOw4cPc+TIkbLXUwlvOqtv0P+XTHyN/7upqaR1GTCsuYHpE8YwrLnwt3JnVy97D3fSHy3stHvyNRk+oonuAO3LWhCJGG+97ELedvkCIhFdl0fKV+ildHMJ6in5vSuXHpsT1cVC0wrsxWsi4rWaqgCPHj2aN7zhDX4Xo2SNjb0MH34USzRpjhzZzIIFMzn99NPo728uen3RKHR2xv+ePXsCs2d7WNgSDLceLh37JxoTz6+pAS49GV4/4QK63bCi19fe3s7OHTs42NbNR264gr+97tKcy/f19XPrj5bxyJ9aGDVmLHPnzmXYsNzbTX9NRoxsZv6CmZxW4msiqRy7du3mwZUb2PDcVv7znz/AKdMm+F0oCbFiLwecS9BOySdbf100/txctD8UrcBeviYiXqqpCvCkSRP53Of+0e9ilOyXv/wenZ1HB91mBhMmNPG+94X3eSW1PfVDurZGIGXAU2NDhL+5cBTHXXIT27c/x+rVK+nsbGf06LH81V9dzuzZZ2ZdX3t7Nw899DBPPrGSn92/kqvecDYTT8h+TfANz7/EiqdamDBxMle9+Souv+KNDBuWu9WxlNek2OdRr5xr5PktL3DfffexefNz3L30Sb72qXf4XSwJsVyXAw57ZWtQ629SWitwEFtaS3lNgvg8pPbUVAW4eViM6SdnHr0bBp2d7VlvL/V5BSlI2pY9D7G0frexfmjdwmutG1i16lgrQWdnO6tWLeP4E/uylrejdSpnnjmPLc9tYu/LHfT3555uoa+/HwdMnzaN0+edzsyTJtE0/OWcjyn2NWnZsKXo51GvzE2kr28Wp502l507ttOb5/UTyacS8+sGJUOP7Nk20Pqb5KL9HNmzdaCcQWxpLfY1CerzkNpTUxXgsPN65HHQguTMf7w1632333ZXIFtuin1NarkFSiToajlDc+UnBDd7lKESVBp1EiCLlyyiqWnwd5JyRh7nCpKgqUTLjReKfU1KfR4tG7Zw+213ccvNt3P7bXfRsmFLaQUWqWPK0MJvrxZlqASVWoADxOuRx0ENxEwqPe9mqYp9TUp5HkFqZRIJM2WoMhSUoVIYVYADxsuRx0ENxEyqMe9mqYp5TYp5Hql9C9PplJ9IaZShylBQhkp+qgAHRCUGWgQ5ENMFdd7NYhX6PNJbLDIJYiuTSBBVaqCaMrT6lKFSLaoAB0ClTt+ELRCLaSVo2bCFFY/eTXt7KydPi3LtpC76ezqB4ytbyAIU8jwy9S1MF8RWplrS29XO1id+wdzLbqR5ZPbp8yTYKnn6u9YzNPm8ThzbzMXD9zD/w/8jEHMKK0PDIewZqgpwAFRy1GvQJnP3QvoBb17TPqY197Jrw6PMnPFRn0tXmHwtE0FtZaole1pW0L5/F3taVnDqxTf4XRwpUaVnDaiHDJ3csZXYkYM8+5sfcf7f/ZPPpSuMMtR/Yc9QVYADoNyBFkGZp7JaUg94w+hlhh3CDOy1bfR2tYfim2i2voXJ+2r9NfRbb1c7B7avBhwHt69hxvwrQ/G+kaG8GKimDD2EAX0vrqOvozUQrcD5KEP9VQsZqgpwFtUMxGwfZDPjlptvz7n9ehz9mrqv5tjeY3c4F5pvotn6Fl57/ZKMfd1yvRfr7eDthT0tKwauquVcLDTvmzCp1vsyW36OGDmc22+7K+/2laGDMzT1ynJBpgz1Vy1kqCrAGVQiEHN9wDJ9kAFc4s2Va/v1OGl48oCXbLlosPh+arDwfBMtdaBH+nvBq/dqPR0Aki0XLha/8pyLRUPzvgmLamZopvxsaIjQ093D0a7uvNtXhg7O0EPrn2Da5TcEvhVYGeqfWslQVYDTtGzYwu9+88hA5TOpnEDM9wFL/yCbWcHbD9M8lV5JHvDm9O8acl+YvomWOtAj9b3gxcG73lrAUlsuksL0vgk6PzIUBleEent6OXp08KXKlaHH5MpQXCw0rcDKUH/USoaqApwi+SZOD+6kUgOxkA9Y6gf5lptvL3j7YZqn0ivJ/fT67zbRkP4hjEXpOLDbj2JVRL6DsxcH73prAes4sHug5SKp1t43fvErQ9MrQsrQ3AYy9N6NNMTSMjTaz5E9W/0oVkUoQ71XKxnqSwXYzK4Cvg00AP/HOXdr2v2XA/cBLyZuWuqc+2q+9UajTXS2TSq5XCsevTvntCpjx44raf25PmCZ1jd27Dja21sL2v6iRdfw6CNL6e/vG7itsbGJRYuuKWtfBFlf52s0PHMvs97zPf7w1AYefPB+OlsP8Yv/+ARTJozL+/jDh1s5ePAgr7/WxajRwd5H+d4LxbxXsin2/ekVF4vy+uuH2X/gIL19fVjFtjTYgus+W6Ut1Z98U1OVWqkstpJSTKXWs7l+3UiOHhlHNJq58h8kyQw996af0jhqfMZlOtuqXCjPGKNGdWONrwP53wtefAGqt7MItZKhVa8Am1kD8D1gCfAysNrM7nfObU5b9I/OubcWs+5DB1/jrjt/XnLZMlUkjjH6+kaXtH6zJpzry3h7pvX19Y0G2oDUIM2+/aamSUSj+3GuD7Mmmpom8adVz/GnVc8VXdagaIp1cXr3Sp4ffjl9kZGD7pvV/RRT+l7guV98mXue6eNoVydXnDOJSeMH9z1Kn6PwnNNmMmvKWF54cSc//vFPWLNmDePHn1jNp1W0fO+FYt8rmRT7/vSOY+OzG9n54k5GNDrevvi8Cm5LqiHXAb+caamKraQUU6ktf65fo69nAlue28tTTz3K0aNdBT6usuIZ+gTPD78sQ4Y+zZS+F3jiR19k5/CLS1pHUEUiDZx11plcdPECRo45nPe94MUXoHo8i1AL/GgBvgDY7pzbCWBm9wDXAekV4KK9/vrr/N977in58W+8bC4jRjQPuT0Wc2zcuIdX920sab2TpxzHWWdOo6ExMnCbcw7netm3bx1bt+7n1X1tQx4zd+4khg9voru7L7FMadsPo3ef2cuYk6L0PPcbfv3csddk7DDHLVd0Yw0w3XYT6RnB2XNmMXLceG790bJB65gT2crUyD7u++WP2BabA8DsWbPo4xW27trHihWvDq43BlS+90K575VM789of4xNz+3k1X3rPX0u6SIR49w5E/jqZz/A5PHHVXRbUnm5ZrTJNDq/UNkGCre1dnD7bXcNqbAWW6ktfa5fo697BmtWb2Tp0qWsWb2GaDSa/2FVcMPpRxkzvZe+5+/ld8+PGLh9THOMmxd1YA1wYvcL3LliLx29kaLWEWgGq1evpr39Bq64YhHz58e/WGd7L3hxsZMwXTFQjvGjAjwN2JPy/8vAhRmWu9jMWoC9wOedc3mbM82MhsbSn9L27Qc544wpNDSkVASiMTZv3sfBg0dKXvfBg0fYvGUfs2dPZPjwxoGyAowY0cxZZ00jEolvM7lMd3c/27cfYP/+YweTcp5bmIxtjnHhjCgRg4tmRFn+YmQgoK+e203y1YkAb5oT5f7tr7L5xVcHrWNMc4xLLzyMGUxgL3evPkpnSsg3Nw+jPxrN2lcxSA4ePMLBgzsH3Zb6Xsh3fyHrT31/Jt975bznC+ViMV7v6OX1tiOqANeAYqamKkZ6JSVV6oCj1GWqMxK/me7uKK+9dogD+/fT1BDjhsULOWHc6ApuM7+GWDentC0nAlwyo58pZ11ENDIcgIlHWmjo7QQcjQ3GZ5aM58Co+UWtI8h+9dCTtLUe5uDBA3R0dHP8+JF5v+CUe7GTsF0xUOL8qFFl6uqXXgtZB5zknOs0s2uAe4E5GVdmdhNwE8DMmTP5yIfLG7na2XmQ1raXiEZ7aGgYxvgTZjLrLd59i3v5lbVEo4NHJzc0RDjnnJmAw7kYACNGNHHOOTM44fhTGT16gmfbD4Oprb+n8chzQIzGhgiffuup7Bt3BY3RI5z26o8HKsCNDXDx9BgnLHw7/Q2jhqyj4UjbwDr+YckM9o27otpPJbROP63y23A4NmxoYfNzz/Hxf7ubm296G2++9JzKb1gGDM7PyWWvr5IVgWQlJTm3b6q+vn4efvD39PdHfRqJn5hGLAI3XnsJE0/wdyqoHU8v5UCH4WLQEDEumdzOqRdfSW9XO2t/+xAuUd4IjhOir3Dlkg8Mmb4q2zqC7uln1rH7cPUbNmrxioG1zo8K8MvAjJT/pxNv5R3gnGtP+XuZmd1hZic65w6lr8w5dydwJ8C55813778x2FNwfP1/PZXxdueGnjZzLkZf/0Hef+PfV7pYgdHX+Rov/PD7OOJfBCLEmNDzAouu/woH/vRTXj8YgZRTjJEG49IpB5n2pg8UtI6m0ZkHfNSK5zatZeXKh2lvb2Xs2HFcfvnVnHnW+X4XKyPnGrjwwgu59957eXLlH/j9M8+rAlxlqfl5/sIzPKk1VLoikK2fcfq0Z1DbI/GzyTVHa6HTV9XKPK+lqKf5fOudHxXg1cAcMzsFeAV4L/D+1AXMbDKw3znnzOwC4me7X8u34kikj+Gj9uZbzBfJD1Wx2ttbA/ucKuHV3/8IEq3gA1yU1575Pt2vboVo2mCtaB/d+zYM2ke51hGGuS2LlRrYqdrbW3n44V/TOKw1mAEem8TIkSM4buwYGuuke4+UrtQMrdWR+NnkquQWOn1VrczzWqhsGVrr8/nWu6ofdZxz/Wb2SeBR4tOg3e2ce87MPp64/wfAO4F/MLN+4CjwXheGzppZpE+Sna6pqZHGpsaBqxalqrdRpEf2bMNF066Il5iX8sx/vDXLowpfR63J996qxxYwqT3K0MLlquQWOn1VrczzWghlaP3ypdnFObcMWJZ22w9S/v4u8N1ql6tScs2NmTzFAmgUKRRcya30OsIi37yrUH8tYGGSPlWfZKYMLZwXc7TWyjyvhVCGhls5GarzjlWQ68PzuX/+2KD/1fdIilFIMNdbC1iY7GlZQfv+XTV7atkrylCpFGVouJWToaoAV0Ghk2RXaxSpOvn7z6vXINt7K6keW8DSBbWVNTnQCFzdDDAqVZAzdOzY4xk//pSKb1MGW799N8vXbKT1SBfjRo1kycKzOXf2SUWvRxmaX61maObZr8VTi5csoqlp8HcNvz5Uyf5OqddBf+De5bRs2FL1stQrL1+DTO+tpOPGjSl5/tWWDVu4/ba7uOXm27n9trtC/f5IbSEoRm9XO5sevoPervb8C5dYruRAo+QAI8ksyBna3n6Y3btbGDVKh9NqWb99N/euWkPrkfhV91qPdHHvqjWs3158H2VlaH61mqEFtQCb2buAXwBznXO7E7d9G3grcIlzbn9RW60zQZokO1N/p4FO/vP/CtzQK+GJtx5/7KnMr8FjTzH/nEtw1kF8/Gd+lXhvpQ8KCfNI6HJaCCrZPaGep5kqRdAzNBaLcvzxDbxY9dLUp+VrNtKXdsW9vmiU5WuKv1qqMjS3Ws7QQrtA/Ab4f4EvAR8zs88D7wMuVeW3MEGZJDvbqZ621g7Wr3mNI0eOVLlE9aetrS3r7aue3MHMmVOZcdJorKG1oPV5/d7K+SUpAO/hYmRqISgkiCvdPaHeppnyQtAztEEdCqsm2fJb6O35KEOzq+UMLegjm5iP94vAQ2a2A7gZ+Gvn3DYzmwH8HJgI9AH/5pxbWsTzkCrK1t+psXEY3/zmN+nqKi1AAEY19vO2mfu4/6UpHOnX0SCbOXPG0NzcMOT23t4o3/rWtznllFO4/vrrOG/hGYwYdRAorDXYK7m+JIVJb1c7B7aV1kJQaugXqp6mmao12TI06sHHNKh9LYNm3KiRGSu740aNzH/BgCpQhoYjQwuupTjnHjOz1cD/BK51zq1O3NUPfMY5t8HMJgJrzewR51zpNakAqNWBYouXLBoyVVAk0sDrr0fZvetFRjY30Nw0tHJWiDec2s6MUb0sOvEVHtyh8M5m70u9zDzlRCINx/oMxqIx9r70Gm2vt7Gxs4OZM2cwZcpUZs0+ASIHqlq+QgccBd2elhVDA7KAIK5G94R6mGaq3jL08OGhV6Ir1q61y2jf/yK71i5j7hveW/b6atWShWdz76o1g7pBNDU0sGTh2ezYuNPHksUpQ8ORoQVXgM3sr4H5gAED3R6cc/uAfYm/D5jZYeBE4KWyS+eTWuq/ky69v9PYscczZcpp/PHJNTQ3wHdu/iBnnDqt6PX2drWz5lf/E4AFE/v46Cf/IVQtGNVueck2gvnL/99veerZnUSjfTjXjx/jVDMd4MM4Erp9/04g7RRZAS0E6p5QvnrL0PHjT2Hnjj+Xtd7ernYO7VgHwKEd6zj5/GuUoVkkZ3vwYhaISlCGhiNDCx0ENx9YCnwKeAvwdeDNGZZbCDQBezwsY9XVUv+dTI71d4rQ3TmDP/3paWBNWevctXYZxz4oLnQtGNWej/Xc2ScFJqzTBWnAUTnGTppFd/shXCyKRRqYOOeCgl5bdU8oX/1k6DA6Wk/kiZVPlL1OZWhxlKGVV+sZmrcCbGYnEb9q2+3OubvN7BngWTO73Dm3MmW58cDPgI+E+bLFUDv9d6olteUiKUwtGGGbj7Uap5aDMuCoVOWcgquH7gmVpgwtjjK0upSh+dVDhuY8v2pmJwCPAA86574K4JzbBPyaeCtwcrlhwO+ArzvnnqpccSsndc4+M8u4TNj671TL4JaLJJe4PfjCNB+r5nEuTK5TcFIZytDSKUOrRxlamHrI0JwVYOfc6865ec65v0+7/T3OuYsBLJ50PwF+75z7ecVKWkHpH4hMDdhh7L9TjBGRXj567hFivcVPg3Z4T+bgyHZ7kGT7llupibvLlevUshwTllNwtUIZCiMb+vjw2R30d3cW/VhlaPUoQwtTDxnqxVxVlwLvId4t4vrEbR9wzhU/I7VPMn0gAMwM51xo++8UY8Holzl5VJTul/4C8+YW9dhho8bR1Tt00o9ho8Z5VLrKCUtn/SSdWi5MWE7B1QplKPzVCfuZOTbK61ufZOrU4vruKkOrRxlamHrI0LIrwM65VYT8ksrZ3vjOOf7t3z9X5dJUn/W2M2fUASIGvfs309vVXlT/rTB/UML2LbdWpteR2lLvGRrp62DemNeJGHS81EJvV3F9d5Wh1aMMlSRdrQB9IJr3LD/2T4C/uVdC2A48mabXgXgF5Pbb7qr5VjYJpnrP0FH7/kCyD69zThkaYMpQSQp1y61XFi9ZRFPT4O8Ctd5fLamv8xDNB56h0RKnsFws0P236t38BfO49volGSsWGswhfqnnDO3vPMSI19bTmDyaumD3ga13ylBJUgWYoR+I48aN4drrlxT0LTB15PPtt90Vug/Ogad+XPMjPSult6udTQ/fUfUD3fwF8/jcP38sY4BrMIf4odQMDXt+Ahz6808ZcrEAZWhBlKHiJ3WBSChlzr5CrnZUyfkGvVh3195NmAtP/60gqcbE7y0t63h8xUMZX+NiBnPU6mVpg67aVxj0U7EZWujV4oKeoUf3PacMLVFVMnTDBlaseEQZGlKVzFBVgMuQ72pHlbwcqFfrnvOhn/KnPz3Nb379G7a/8Bx3/OuHS7oUcr2p1MTvsYYYC86dxuHDm7nnnvglkaOJ692nv8aF9rus5cvSBl21r44VJoVcLS4MGXrKB+7miZVP8Otf/YYD+3bz37d9iokn1PaXHS9UKkObRw3nzGmjeeWV1fz855vo7+9VhoZYJTNUXSDKkO/bYyXnG9Rchv6qxMTv67fvxjU7xg6LcXFkC9bbMRDcSamvcaH9LvVe8Uf6AV59QgcrpPVNGVq7KpWh4yeM4PIR2xhGHz09R5WhIVbpDFUFuAzZRjgnb6/kfIOay9A/lZr4ffmajWAwx/ZyAp3MsVcyLpd8jQvtd6n3ij/CdHUsP+TLT1CG1qpKZujchn058xOUoWFR6QxVF4gyZJpOJfXbYyWnBqqXaYeC2IeyUhO/tx7pYhi9zLBDmMEMDrHNTaOHpkHLpb7GhfS7zPdeUd8272U7wHt1mrcW5MtPUIZ6oZ4y9OiRVmZEcucneJuhys/KqEaGqgJchuSbPNubv5CAL1Ul1h1z8H+WPsn0SSfkXG7axHHccOVCmhobSt5WoYLYh7JSE7+PGzWS6V27Bt02x15hkzt54P/GxiYue+Nb6T4yteD1XvbGt7Js2W/o7+8bsp61f9nHsmUrBu5ra+3g/t+toL9nHGeedX5Zzycf5xro6jpKW3sH/f1DryLmpWpXAsJ2dSw/5MtPCFOGGgD9Ufjuf69g3NhRZZevXLNnTOStl82vqww9s/kApERJen6Ctxl66qyz4nnpQ34CxKIROjuP0N7eTiw69PLjXqrFDFUFuEy5vj0WEvDlbLf8dcdoHt7H5MmTmTZtOjt2vshfNsZ/cj4qFmPpY0/xtU+/l7knTSnjWeRWqUES5arUxO9XnjOLI395kobEnMwN5pjBIbbbTLpjERoamhk7dibr1+9i/fpdRa177NiTaGt7iWi0d9B69u5dSzTaN2jZ/v4+Hnrot0Vvo3iODRta2LJ5M7g+Fl9YuVaT1ErAjPlXVjzIw3Z1LL/ka30Lfob2MmJEhEmTJjNt+nRe2buPx595vuyyecHFYjzy+BPcOHc/9ZChvV3tTHUHIC0/t7lp9EVGEIv1e56hLS1+5mf8WLx69Wq2b9tGc0OMN5w3t2LbqsUMNecq+62hms5feIZ7+pn/8rsYoeOi49izu5tVq/5CR0f+PljPPruRLVu2YK6PL37sbVy16JyKlGvH00s5sO0ZXCyKRRqYOOeCwLRgVMKOp5eyf+tfwMUGbuuPwTP7hnHfttEV2eaiRadgZkNud86xalXuL0Jlc9Af7WfGhFF87f95L6edUpkvU71d7az97ddx0X4iDU2MP/kcDu5Yx6TTLgr8+yky521rnXMLq7Et5Wfpon3j2bm9laeffoajR7v8Lg6xmGPdunWcZRu4YGoPjRFqPkNTjxdJUQfPvj6aezYOq8g2fc1P4g2k0Wg/p884jq99+v1Mnzy+Itup1QxVC3CA+NWXyBpamXFKE++adhX9fUM/zKmci7Bj+yXcf/99PLFyJY89takiFeB67EPZcWD3oMovQGMEzp7aSN+ksyuyzU66cAz9EhwhwjWLKrPNVDMnH8+733zBkJHYXko9lRaLRTm4cx1BaxETb/iVoQ1NrzH79GGcdPJbiUZzZ2g1xKIRFp49m+jjq2lIFKfWMzRTi2GDwewTXMWyzO/8BDh91hSuu3wBkUjl5jSo1QxVBTgg/J5n0KyPpmH7aMrzRdliExgzZgzjxh1HU1MT9LRWpDy11Iey0L5TuU4LvrkSBSM+bdC9q9bQlzJVUFNDA9cvWsi5s0+q0FarJ/2LVOoXDOditDzwLeZf+5msr0sQBxBJZv5naA/NI/ZVfDsFiU2l+aVH6U6ri4cxQ5Wf/ionQ4Oen5oGLSCqNc9gWC49Wkt9KFP7TgXNubNP4vpFCxk3aiQQH4hXS+Gd6YtUkotF6Tvawa61y3I+PqivnQymDB2s/9BWIgw+oxTGDA3yZ7DW8xPKy9Agv3agFuDAqMY8g363kBSjUgPNqi2oA/lSnTv7pJoK7FSZvkilO7RjHSeff82Q1yUMr50cowwdbMxV/8kD99/PY48+ypUXzeOLH7vW7yIVLQyfwVrOTyg9Q8Pw2qkFOCAKmRS+XLV8NZvernY2PXxH4K62pYsh+GvBdZ/lkg/dxiUfuo2Rx2eb9shlfF302oWLMrQ8QcxQfQb9V2qGhuG1UwtwQFRyvsukSrSQHGg9ysate0p+vFe6d/yBvv0v0vLEvQw/9YqS1xPrPUL31ocZPvdqIs3lzeUZ6z3Cka3PgDs2kG//tmfoHHNG2euW4l8rO/VqWPuTgdcjVfrrotcufMKaoUHh1XzBXvX7rMeB0NVW7Gt1xpKPDMwGkS71tQnLa6cKcEBUcr7LJE+ufGR9DBvWzOhRY2luHs6O/a/x91/9qWdlLMWY5hhfvLSDpgY4sncjX/r1Ljp6I0OWufHsLn6xceSQ+1K9/bSjXDy9lyd/93N+98KIssr19tOOcuHUKKnXC+nvi/JYGeueOHEMs2adyLDhjfR097Nz5yEOHAj/wbcUxb5Wqa+Hc5A6e1H661KJ104qKzQZGkCFnK4utLLkVUW6UgOh12/fzfI1G2k90sW4USNZsvDsmu7CkEuxr1XO/sApr01YBrH7UgE2s6uAbwMNwP9xzt2adr8l7r8G6AI+5JxbV/WCVlkhl2QshxctJM5amTR1LIuvvAyH49lnN0KGaWCqaeGI54lEOgFHQ8R434VjWXv09CHLzGruyHhf0nDr4cKxTxExuHB6PwfGnk23K33+yHmj/0JjQ++g2xobYN6UZl4aU/zUro2NvQwf3j1QcRs+ool5Z0zhlFmn0N/fXHI5g2C49XDpqE386chZBe3zYl+r5PKNiX2XPnVn+uvi9WtXqj//5ZmqbasWhCFDgyjT6er0ikohlSUv+31WYiB0+qwNrUe6uHfVGoDQV4KLbc0t9rUaMhtEmtTXJiyD2KteATazBuB7wBLgZWC1md3vnNucstjVwJzEz4XA9xO/pQxetZBEGtqZMn0cixf/NbNmnVqJohaup43hf3kSix27+s+cEQeYcfknYNjYtGUYel+KphfuoeFVAwcNEePaeUbf3LeXUbi3czTDrSOA61P+j0QiTJgwgZEjhw+pmKX65S+/TWdn96DbzGDChGG8732fLqOc3opGHa++up+enp7MC/S00bz5x/Se8eGB16HphXto2NdW8D4v9rVKXT7JWQPRKZfQN/c9QPrrUthrV2nf+94dVdya5FONVuZqK+R0daGVpUIq0oWqxEDo5Ws2DpqyDKAvGmX5mo2hqgBnquyW05pbyGuVqVU328VVwjKI3Y8W4AuA7c65nQBmdg9wHZBaAb4O+JmLX6buz2Y2zsymOOcCMslieJXfQhKhr3sSz7bs4N5772fbtq3EYv61AF855VXOPr6PxpReDdH+Pp5/8D9ZsW/ykGXS70sa1djPx+buwCLx52Iuint5FT/+/T6O9Ff2YxKJGGeccSZve9u1nHX2STQOO0SmVvXOzraMj+/sbGP6yd0Z7/NKy4bNPL78Sdpa2zlu3FgWL3kj8xecMWgZFxvD/r39/OEPT7JixQqOHs1UhYy/HvNPaB14HVL3fSH7vJTX6m9PfZFJIwYf+MxFeW3HM/zssYPF7Aqpc5VuZa62Qk5XF1JZCkO/z9Yjma/Sl+12L3nZ9SK9sltua24hr1VYWnWL4UcFeBqQOmrqZYa27mZaZhqgCrDPzJ3Aq/s6WLNmLevWraOnq43mCl7FK5PRTTHedXonv35+NJOHdQyq/EL86mmTh3XQ2RphdFOMs8a1DizTGIGzxrWyYjt09h174GWzjmBplU7DsXDsHh7aWdlBTz29UdZ0dTF9+jQmTZrA1OmjcXZ4yHK5+x8OHZTglaFTP7XzwL2PANGUikCEnqNj2bLlGZ566k/senEnw5sjNEQGN2knX4+IHXsdFs44OrDvC9nnpbxWd6wdBWRb54F8u0CkpqS2IOar2BRaWQpDv89xo0ZmrOwm5/GtFC+7XmSq7HrRmpvvcWFp1S2GHxXgTCd505u7ClkmvqDZTcBNADNnTs60iHjJGdFojP7+XnBRzpt9At/88ieqWoQdTy9l/wt/5n//7bycH/J3kPn68M1NDUMeu+G+b9J1eO+gxzdG4PIzx/OZL1b2g//RL36bV9piRPv7iMViZPtY+tX/MNfUT8cqwEYsFn9fxKL9DGsyfnjLh5lz0uDPZOrr0dzUwH+8/1Re29UyMDFDYwQumhHjHz/ziawtEX6+VtUWmfO2iq5f+VmfUlsQ81VsCq0shaGFcMnCszNeuW3JwspettjLrhfpld1da5fFM7TOW3NL4UcF+GVgRsr/04G9JSwDgHPuTuBOgPMXnuHvaKw6ZBm/q5SmkE78xZ7qKfSD7ue320L3oJf9D1s2bCl4PV5N/ZSpJenQjnVY2jXsnYuxe+0yejpfz/heqNRrFfTLdlaC8rO29HYcZsevvsPsd/6v7MvUYIYWKlnZ9KIrQjFdGrzqehHkDA1jfvpRAV4NzDGzU4BXgPcC709b5n7gk4n+wRcCber/W/sK6cRf7KmeMITyUI1A5lkd5i+Yz/wF88tae8uG57JczaqR+QvOHLL8cePG0tY6dHL8E8cOY8uPvsbsd3+O5jET8m438xQ6LuPB9fDLW+jvOVrV06deTd8k4pe9K5fS+dILvPLET2H232Rcpj4yNDsvrtxWbJeGbF0vJoxsYNPDdxRcaQxyhoYxP6teAXbO9ZvZJ4FHiU+Ddrdz7jkz+3ji/h8Ay4hPgbad+DRof1ftckp1FToPZdAHWZRiRHMDnZ0dbGh5lpNOPoWenlMpvF24eI8ueyJjl4ZHlz3BmJFnDVn+nLMv56mnlhFNmfy8oaGRc0d20rl7M5t/+1+MueRTdHTsZO3a9bzyyl4iBsOHDa7EZ7uk5sjjpw46yPZ2tbP2t1+nmpfQDMNlO0Vy6e04zKH1T4BzHNrwCKOnvWXoMjWaodVWbJeGbF0vLjnuMO37X2T32mXMecN78243qBka1vz0ZR5g59wy4pXc1Nt+kPK3A6rbsVSqKv10SaHzUAZ9kEUpPvPRd/M/vvFfbNy4kb179zJ58pSKbm/ChN6M0611drZz223fyPiYYcMco0dDJAKxGPS099DkNoDFr8L306c7ea2zn5d276YxEuPj77mSGZNPGLSOQluSvJxKqVB+bFOkHAPdHd79aZrGjGPvyqXH8tHF6HnuN8DEQY+p1QyttmK7NGTqenHlObPoXv0TAA7uXM9J51+Tt9IY1AwNa37qSnDii9TTJTPmX1lQq0StdtyfNX0iv/jPT3Hnb5/kVw8/Revrr1V0e2MvOoXhw5uG3N7T08fzm7cWtI53z+vCxsX/NmB2dAPrd41kzvTj+Nqn38/0yeNLKpsfLVRqFZMwGujusHIpUy9/O4fWPzFwiVoX7aP3xZU0NV876DG1mqHVVspsEuldL7b98R66U76wFNoKnE+18yzM+akKsFRd+umSaH9vQa0StdQXLb0FvKmpkU+8969571UX0H4k8/y5Xtm+91X+uOkF+mOxgdsaIxGuvuAcPnX9m/I+PtrTyYEnvz/wvxn81dR+3vb+Gzlp5kwiaQMyipGphSoW7WPX2mXM9eDgUOg2w9SKIfVnUHeH9U8Q6+se2jfUxZjZu3HQTbWcodVU7mwSvV3tHNw5+OK2hbYC51PtDA1zfqoCLFWXfrrk8J4tddcqkW3AwPhxoxk/bnRFt33KtAmcePzYkkdCb/vj4wydldDRv+fPRE4+ueRy9Xa1c3D72ox93A7v2VLyevNp37+z7t5/Em7p3R1aX1g/0Po7INbPcXaQWj3M+znoqtzZJHavXZbxC0u5rcB+ZGiYzyrU5idDAivT6RIX7WPhu78c+NMlXgnCgIFyRkIffjlzkGa7vVB7WlYQi/Yx6bSLB65utPa3X8dF++OndLvaK7Kfxk6axdHWA0w67aLAt1iIJFt/j3V36CfW18uCf/4+TWPGxReKTWXr8/t58v77iY83ry3K0Mz8yNAF1312YG7+sGVo6ecqRUqQ63RJvcg0YCBMmkeOK+r2QqQf0Hq72quynzJtVyTIBrX+JrkYr6xc6k+BfKAMHUoZWjy1AEtVVep0SVgm4Q7zgIGkSvQj9OLqRl5sNwz91qS+HdmzbUh3Bxft58iewgawZqMMrR5laDCoAixVValBGEGehDv1wBLmAQOVUszVjbzcT7VwIJX6c+Y/3lqR9SpDw0sZWhp1gZDQC/opmNQDS5gHDFRKMVc38nI/qTuOSJwyNNyUoaVRC7CEXpBPwaQfWM57xxdC8c24mgq9ulE1tlvvB1KpT8rQcFOGlkYVYAm1Sp+CKbdfXJAPLEFRqYDO99rV0pyoIqVShoafMrQ06gIhoVbpUzCpp96Kle3Aknp6sbernU0P3xG4U461oJzXTqReKEMlm1rPUFWAJdQqeQqm3H5xhRxYaj1g/BL0Po0iQaEMlUzqIUPVBUJCrZKnYMo99ZbvwBKEydzDotjTqDptKlIYZWh9UIYOpQpwmVo2bOHx5atoa+3guHFjWLxkEfMXzPO7WFImL/rF5Tuw1EPAeKWYKZrCPjVPvVGG1iZlaLAoQ4dSF4gytGzYwgP3LqettQOAttYOHrh3OS0bKnPNbameTKfeYrGoZ6fZCunb5sU2aqFvXLGn4sI+NU89UYbWLmVocChDM1MFuAyPL19FX9/gK/L09fXz+PJVPpVIvJJxWhkX82x6l2oEjJ9947w8cBR7Oc+wT81TT5ShtUsZWh5laOWpC0QZkq0Whd4u4ZE89dbb1c7a334dF+0n0tDEGUs+4sn6Kx0w5faN82LqIi+uKlXKqbiwT81TT5ShtUsZqgwNOlWAy3DcuDEZg/q4cWN8KI1UQqX6mGUKmGRg9na1l93Pqtxyp4bvjPlXFhXkXg5M0WVPa5sytPYpQ5WhQaUuEGVYvGQRTU2Dv0M0NTWyeMkin0okXqpGH7PUbbU88C3a979Y9um2csudHr671i4r6jRgsafbcqmXU3H1Shla25ShytAgUwtwGZIjlTWCuTZV85vz7rXL6Dsabwnz+xt/evge2rGOQlsish04Js+9iBefubfo04H1ciquXilDa5syVBkaZKoAl2n+gnkK6xpVrW/OvV3tHNy5buD/5EjpUg8Q5ZQ7U/gOlCvax661y5j7hvdmfXy2A8fWJ/+bo20HBp5Xuf3jpHYoQ2uXMlQZGmSqAItkUa1vzrvXLhsceC5WVgtGOeXOFL6pDu1Yx8nnX5O1XNkOHEfb9gPHWma8GuAhIsGlDB1KGRocqgCL+Ci95SKp3BaMUmWcumgQl7MFI9OBY8fTSzmw7RlcLIpzMXatXcZru1rQ1ZtEpFzKUGVoqVQBFvFR1tYCD+fLLEZq+G6475t0Hd47ZJnDewq/SEGm04GHdqzDIvHxtxqNLCLlUIYqQ0ulWSBEfJQtoEceP9X3wQsLrvssC9/9Zaxh8PdkF+0reDR05oOTq8qocBGpfcpQZWip1AIs4iO/AzqfckdD5z8dqBYMESmdMlQZWipVgEUkq3JHcacfnDKdEtSclCJSq5ShwaUKsIhk5XXrStBba0REvKQMDS71ARaRgvV2tbPp4TuK6m9WymNERGqRMjQ4VAEWyUKhM1Tq3JOVfIyIhJ8ydChlaHCoAiySRa2HTrEHp/Tr2xfyuFIeIyK1QRk6dHllaHCoAiySQT2ETrEHp/Tr2xfyuFIek49alUSCTxmaeXllaHBUtQJsZieY2XIz25b4fXyW5XaZ2UYz22Bma6pZRhGoTOgESbEHp0yTsed7XCmPKUSttyqJ1AJlaObllaHBUe0W4C8Ajzvn5gCPJ/7P5grn3ALn3MLqFE0krpzQCcs362IPTrnmsvTyMfnUQ6uSSNiVmqFhyU9QhtaCaleArwN+mvj7p8D1Vd6+SF7lhE4YvlmXcnAqZS7Lcue/zKTWW5VEakGpGRqG/ARlaK2o9jzAk5xz+wCcc/vMbGKW5RzwmJk54IfOuTurVkKpe6WGTvo36xnzr6R55NgKlrQ0pVyZqJS5J72erzLbQSeo+1mkXpWSoWHJT1CG1grPK8BmtgKYnOGum4tYzaXOub2JCvJyM3veOfdklu3dBNwEMHNmps2KFKfU0Mn0zTrXpSl7u9rZ+sQvmHvZjVUNn0q0KlRDvoOOX/szzJSfUgmlZGix+QnK0GIpQwfzvALsnLsy231mtt/MpiRaf6cAB7KsY2/i9wEz+x1wAZCxApxoHb4T4PyFZ7hMy4hUWinfrFNP91XrGu69Xe00Ng9j4bu/HLqAy3fQ8WN/hp3yU4Kg1JZJZWhxlKGDVbsLxP3AB4FbE7/vS1/AzEYBEedcR+LvNwFfrWopRYpU7CmxUk73efHtvJSAC0qrQK5WpTCdPhWRwUrpUhCWDA1KfoIyNF21B8HdCiwxs23AksT/mNlUM1uWWGYSsMrMWoBngIecc49UuZwiRSn2lFip80GWM0Ck1NG/YRiYooEdIuFVSpeCsGRoGPIT6jNDq9oC7Jx7DVic4fa9wDWJv3cC86tZLqlfXn07L6bPWymn+7z4dl5qH7ugtwpoYIeIf7zI0GL7DIclQ8OQn1C/GaorwUldS/12Xq05KMudD7KUb+fFTtuT3Be71i4LfKtAJebKFJHCKEOzZ2jLA9/CxWIlb7Na6jVDVQGWupX+7Xz32mVVOVVV7Ok+L64GVGzAJQ9qh3as8/wqRF4L64hskbBThmbP0N1rl9F3tANcrORtVku9Zmi1B8GJBEZqoMViUQ7uXEc1TlUVe7qvlAEi6YoJuNSDWrpit1sNXs+VKSKFUYZmz9D4vhgsiPkJ9ZuhqgBLXUpvEUh+S4fghZQX386LCbhMB4tStysitUkZml22DFV+BosqwFKX8lXygjQAoJrfzocc1IBIQxPnveMLgdgXIhIMytDMjp1BO0YZGkzqAyx1KVOLQKp6GACQSb0OhhCR4ihDM1OGhodagKUupbYIbLjvm3Qd3jvo/no9VVWvgyFEpDjK0MyUoeGhCrDUvXodAJCJ9oWIFEu5cYz2RXioC4SIiIiI1BVVgEVERESkrqgCLCIiIiJ1RRVgEREREakrqgCL+Ky3q51ND98RyEtkiogEnTJUSqEKsIjP9rSsoH3/Ls0TKSJSAmWolEIVYBEfHbtqkOPg9jVqwRARKYIyVEqlCrCIj1KvGqSrBYmIFEcZKqVSBVjEJ8mWi+RVg1wsqhYMEZECKUOlHKoAi/hE14wXESmdMlTKoQqwiE90zXgRkdIpQ6UcjX4XQKReBfGa8b1d7Wx94hfMvexGmkeO9bs4IiJZKUOlHGoBFpEBmk5IRKR0ytDwUAVYRABNJyQiUg5laLioAiwigKYTEhEphzI0XFQBFhFNJyQiUgZlaPioAiwimk5IRKQMytDwUQVYRDSdkIhIGZSh4aNp0EQkkNMJiYiEhTI0fNQCLCIiIiJ1RRVgEREREakrqgCLiIiISF1RBVhERERE6ooqwCIiIiJSV1QBFhEREZG6UtUKsJm9y8yeM7OYmS3MsdxVZvaCmW03sy9Us4wiIiIiUtuq3QK8CbgBeDLbAmbWAHwPuBo4A3ifmZ1RneKJiIiISK2r6oUwnHNbAMws12IXANudczsTy94DXAdsrngBRURERKTmmUu7dnVVNmq2Evi8c25NhvveCVzlnPto4v8PABc65z6ZZV03ATcl/j2LeCtzEJ0IHPK7EDmofKULctlA5SuH32U7yTk3oVIrD1F+gv+vRT5BLl+QywYqX7mCXD6/y5Y1Qz1vATazFcDkDHfd7Jy7r5BVZLgtay3dOXcncGdi22ucc1n7FvspyGUDla8cQS4bqHzlCHLZvBCW/ASVrxxBLhuofOUKcvmCXDbPK8DOuSvLXMXLwIyU/6cDe8tcp4iIiIgIEMxp0FYDc8zsFDNrBt4L3O9zmURERESkRlR7GrS3m9nLwMXAQ2b2aOL2qWa2DMA51w98EngU2AL8yjn3XIGbuLMCxfZKkMsGKl85glw2UPnKEeSyeS3oz1XlK12QywYqX7mCXL7Als2XQXAiIiIiIn4JYhcIEREREZGKUQVYREREROpKaCvARVxWeZeZbTSzDWY2ZN7hAJTPl8s+m9kJZrbczLYlfh+fZbmq7b98+8LivpO4/1kzO6+S5SmhfJebWVtiX20ws3+tYtnuNrMDZpZxHtcA7Lt85fNz380wsz+Y2ZbEZ/bTGZbxdf9VgjK07PIpQ70vnzK09PIpQ4vlnAvlDzAPOA1YCSzMsdwu4MQglg9oAHYAs4BmoAU4o0rl+0/gC4m/vwD8h5/7r5B9AVwDPEx8ruiLgL9U8fUspHyXAw9W+72W2PYbgfOATVnu923fFVg+P/fdFOC8xN9jgK1Beu9V8HkrQ8srnzLU+/IpQ0svnzK0yJ/QtgA757Y4517wuxzZFFi+gcs+O+d6geRln6vhOuCnib9/Clxfpe1mU8i+uA74mYv7MzDOzKYEqHy+cc49CbyeYxE/910h5fONc26fc25d4u8O4rPPTEtbzNf9VwnK0LIpQ70vn2+UoaULa4aGtgJcBAc8ZmZrLX7ZzyCZBuxJ+f9lhr5pKmWSc24fxN+8wMQsy1Vr/xWyL/zcX4Vu+2IzazGzh83szOoUrSB+7rtC+b7vzOxk4FzgL2l3hWH/VYoyNDNlaHGUoZXn+74LU4Z6fiU4L1n5l1UGuNQ5t9fMJgLLzez5xDepIJSvqMs+FytX+YpYTcX2X5pC9kVF91cehWx7HfHrjnea2TXAvcCcShesQH7uu0L4vu/MbDTwW+Azzrn29LszPCRI+y8jZWh5lKGeUoZWlu/7LmwZGugKsCv/sso45/Ymfh8ws98RPw3jSfh4UL6KXvY5V/nMbL+ZTXHO7UuchjiQZR0V239pCtkXfl4mO++2Uz/wzrllZnaHmZ3onDtUpTLmEuhLjPu978ysiXhw/5dzbmmGRQK9/7JRhpZHGeopZWgF+b3vwpihNd0FwsxGmdmY5N/Am4CMIyh94udln+8HPpj4+4PAkNaWKu+/QvbF/cDfJkaTXgS0JU9BVkHe8pnZZDOzxN8XEP98vVal8uXj577Ly899l9juj4AtzrnbsywW6P1XKcrQnJShHpdPGVo6ZWgJ0kfFheUHeDvxbxQ9wH7g0cTtU4Flib9nER9p2gI8R/y0WmDK546NjNxKfHRsNcs3Hngc2Jb4fYLf+y/TvgA+Dnw88bcB30vcv5EcI9d9Kt8nE/upBfgzcEkVy/ZLYB/Ql3jffSRg+y5f+fzcd4uIn4p7FtiQ+LkmSPuvQs9bGVpe+ZSh3pdPGVp6+ZShRf7oUsgiIiIiUldquguEiIiIiEg6VYBFREREpK6oAiwiIiIidUUVYBERERGpK6oAi4iIiEhdUQVYREREROqKKsAiWZjZu8ysx8xOSrnt22a2w8wm+Vk2EZGgU4ZKkGkeYJEsEle3WQ2sd859zMw+D/wLcKlzbpu/pRMRCTZlqARZo98FEAkq55wzsy8CD5nZDuBm4K+TwW1m9wNvAB53zr3Tx6KKiASOMlSCTC3AInmY2VPABcC1zrmHU26/AhgNfFDhLSKSmTJUgkh9gEVyMLO/BuYTv475/tT7nHN/ADr8KJeISBgoQyWoVAEWycLM5gNLgU8B9wJf97VAIiIhogyVIFMfYJEMEqOWlwG3O+fuNrNngGfN7HLn3Ep/SyciEmzKUAk6tQCLpDGzE4BHgAedc18FcM5tAn6NWjBERHJShkoYqAVYJI1z7nVgXobb3+NDcUREQkUZKmGgWSBESmRmK4gP7hgFvA68yzn3tL+lEhEJB2Wo+EkVYBERERGpK+oDLCIiIiJ1RRVgEREREakrqgCLiIiISF1RBVhERERE6ooqwCIiIiJSV1QBFhEREZG6ogqwiIiIiNQVVYBFREREpK6oAiwiIiIideX/BwCuD1wXxaHuAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 720x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# extra code – this cell generates and saves Figure 6–3\n",
    "\n",
    "def plot_decision_boundary(clf, X, y, axes, cmap):\n",
    "    x1, x2 = np.meshgrid(np.linspace(axes[0], axes[1], 100),\n",
    "                         np.linspace(axes[2], axes[3], 100))\n",
    "    X_new = np.c_[x1.ravel(), x2.ravel()]\n",
    "    y_pred = clf.predict(X_new).reshape(x1.shape)\n",
    "    \n",
    "    plt.contourf(x1, x2, y_pred, alpha=0.3, cmap=cmap)\n",
    "    plt.contour(x1, x2, y_pred, cmap=\"Greys\", alpha=0.8)\n",
    "    colors = {\"Wistia\": [\"#78785c\", \"#c47b27\"], \"Pastel1\": [\"red\", \"blue\"]}\n",
    "    markers = (\"o\", \"^\")\n",
    "    for idx in (0, 1):\n",
    "        plt.plot(X[:, 0][y == idx], X[:, 1][y == idx],\n",
    "                 color=colors[cmap][idx], marker=markers[idx], linestyle=\"none\")\n",
    "    plt.axis(axes)\n",
    "    plt.xlabel(r\"$x_1$\")\n",
    "    plt.ylabel(r\"$x_2$\", rotation=0)\n",
    "\n",
    "fig, axes = plt.subplots(ncols=2, figsize=(10, 4), sharey=True)\n",
    "plt.sca(axes[0])\n",
    "plot_decision_boundary(tree_clf1, X_moons, y_moons,\n",
    "                       axes=[-1.5, 2.4, -1, 1.5], cmap=\"Wistia\")\n",
    "plt.title(\"No restrictions\")\n",
    "plt.sca(axes[1])\n",
    "plot_decision_boundary(tree_clf2, X_moons, y_moons,\n",
    "                       axes=[-1.5, 2.4, -1, 1.5], cmap=\"Wistia\")\n",
    "plt.title(f\"min_samples_leaf = {tree_clf2.min_samples_leaf}\")\n",
    "plt.ylabel(\"\")\n",
    "save_fig(\"min_samples_leaf_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.898"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_moons_test, y_moons_test = make_moons(n_samples=1000, noise=0.2,\n",
    "                                        random_state=43)\n",
    "tree_clf1.score(X_moons_test, y_moons_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.92"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree_clf2.score(X_moons_test, y_moons_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Regression"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's prepare a simple quadratic training set:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Code example:**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DecisionTreeRegressor(max_depth=2, random_state=42)"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.tree import DecisionTreeRegressor\n",
    "\n",
    "np.random.seed(42)\n",
    "X_quad = np.random.rand(200, 1) - 0.5  # a single random input feature\n",
    "y_quad = X_quad ** 2 + 0.025 * np.random.randn(200, 1)\n",
    "\n",
    "tree_reg = DecisionTreeRegressor(max_depth=2, random_state=42)\n",
    "tree_reg.fit(X_quad, y_quad)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.49.1 (0)\n",
       " -->\n",
       "<!-- Title: Tree Pages: 1 -->\n",
       "<svg width=\"682pt\" height=\"269pt\"\n",
       " viewBox=\"0.00 0.00 682.00 269.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 265)\">\n",
       "<title>Tree</title>\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-265 678,-265 678,4 -4,4\"/>\n",
       "<!-- 0 -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>0</title>\n",
       "<path fill=\"#f6d6be\" stroke=\"black\" d=\"M402,-261C402,-261 271,-261 271,-261 265,-261 259,-255 259,-249 259,-249 259,-205 259,-205 259,-199 265,-193 271,-193 271,-193 402,-193 402,-193 408,-193 414,-199 414,-205 414,-205 414,-249 414,-249 414,-255 408,-261 402,-261\"/>\n",
       "<text text-anchor=\"middle\" x=\"336.5\" y=\"-245.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">x1 &lt;= &#45;0.303</text>\n",
       "<text text-anchor=\"middle\" x=\"336.5\" y=\"-230.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">squared_error = 0.006</text>\n",
       "<text text-anchor=\"middle\" x=\"336.5\" y=\"-215.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 200</text>\n",
       "<text text-anchor=\"middle\" x=\"336.5\" y=\"-200.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = 0.088</text>\n",
       "</g>\n",
       "<!-- 1 -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>1</title>\n",
       "<path fill=\"#eb9d65\" stroke=\"black\" d=\"M316,-157C316,-157 185,-157 185,-157 179,-157 173,-151 173,-145 173,-145 173,-101 173,-101 173,-95 179,-89 185,-89 185,-89 316,-89 316,-89 322,-89 328,-95 328,-101 328,-101 328,-145 328,-145 328,-151 322,-157 316,-157\"/>\n",
       "<text text-anchor=\"middle\" x=\"250.5\" y=\"-141.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">x1 &lt;= &#45;0.408</text>\n",
       "<text text-anchor=\"middle\" x=\"250.5\" y=\"-126.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">squared_error = 0.002</text>\n",
       "<text text-anchor=\"middle\" x=\"250.5\" y=\"-111.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 44</text>\n",
       "<text text-anchor=\"middle\" x=\"250.5\" y=\"-96.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = 0.172</text>\n",
       "</g>\n",
       "<!-- 0&#45;&gt;1 -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>0&#45;&gt;1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M308.58,-192.88C301.07,-183.98 292.86,-174.24 285.03,-164.96\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"287.7,-162.69 278.58,-157.3 282.35,-167.2 287.7,-162.69\"/>\n",
       "<text text-anchor=\"middle\" x=\"276.46\" y=\"-178.51\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">True</text>\n",
       "</g>\n",
       "<!-- 4 -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>4</title>\n",
       "<path fill=\"#fae6d7\" stroke=\"black\" d=\"M489,-157C489,-157 358,-157 358,-157 352,-157 346,-151 346,-145 346,-145 346,-101 346,-101 346,-95 352,-89 358,-89 358,-89 489,-89 489,-89 495,-89 501,-95 501,-101 501,-101 501,-145 501,-145 501,-151 495,-157 489,-157\"/>\n",
       "<text text-anchor=\"middle\" x=\"423.5\" y=\"-141.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">x1 &lt;= 0.272</text>\n",
       "<text text-anchor=\"middle\" x=\"423.5\" y=\"-126.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">squared_error = 0.005</text>\n",
       "<text text-anchor=\"middle\" x=\"423.5\" y=\"-111.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 156</text>\n",
       "<text text-anchor=\"middle\" x=\"423.5\" y=\"-96.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = 0.065</text>\n",
       "</g>\n",
       "<!-- 0&#45;&gt;4 -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>0&#45;&gt;4</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M364.75,-192.88C372.34,-183.98 380.65,-174.24 388.57,-164.96\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"391.27,-167.18 395.1,-157.3 385.95,-162.64 391.27,-167.18\"/>\n",
       "<text text-anchor=\"middle\" x=\"397.08\" y=\"-178.52\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">False</text>\n",
       "</g>\n",
       "<!-- 2 -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>2</title>\n",
       "<path fill=\"#e58139\" stroke=\"black\" d=\"M143,-53C143,-53 12,-53 12,-53 6,-53 0,-47 0,-41 0,-41 0,-12 0,-12 0,-6 6,0 12,0 12,0 143,0 143,0 149,0 155,-6 155,-12 155,-12 155,-41 155,-41 155,-47 149,-53 143,-53\"/>\n",
       "<text text-anchor=\"middle\" x=\"77.5\" y=\"-37.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">squared_error = 0.001</text>\n",
       "<text text-anchor=\"middle\" x=\"77.5\" y=\"-22.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 20</text>\n",
       "<text text-anchor=\"middle\" x=\"77.5\" y=\"-7.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = 0.213</text>\n",
       "</g>\n",
       "<!-- 1&#45;&gt;2 -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>1&#45;&gt;2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M189.99,-88.95C171.66,-78.93 151.6,-67.98 133.57,-58.13\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"134.8,-54.81 124.34,-53.09 131.44,-60.95 134.8,-54.81\"/>\n",
       "</g>\n",
       "<!-- 3 -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>3</title>\n",
       "<path fill=\"#f0b489\" stroke=\"black\" d=\"M316,-53C316,-53 185,-53 185,-53 179,-53 173,-47 173,-41 173,-41 173,-12 173,-12 173,-6 179,0 185,0 185,0 316,0 316,0 322,0 328,-6 328,-12 328,-12 328,-41 328,-41 328,-47 322,-53 316,-53\"/>\n",
       "<text text-anchor=\"middle\" x=\"250.5\" y=\"-37.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">squared_error = 0.001</text>\n",
       "<text text-anchor=\"middle\" x=\"250.5\" y=\"-22.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 24</text>\n",
       "<text text-anchor=\"middle\" x=\"250.5\" y=\"-7.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = 0.138</text>\n",
       "</g>\n",
       "<!-- 1&#45;&gt;3 -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>1&#45;&gt;3</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M250.5,-88.95C250.5,-80.72 250.5,-71.85 250.5,-63.48\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"254,-63.24 250.5,-53.24 247,-63.24 254,-63.24\"/>\n",
       "</g>\n",
       "<!-- 5 -->\n",
       "<g id=\"node6\" class=\"node\">\n",
       "<title>5</title>\n",
       "<path fill=\"#ffffff\" stroke=\"black\" d=\"M489,-53C489,-53 358,-53 358,-53 352,-53 346,-47 346,-41 346,-41 346,-12 346,-12 346,-6 352,0 358,0 358,0 489,0 489,0 495,0 501,-6 501,-12 501,-12 501,-41 501,-41 501,-47 495,-53 489,-53\"/>\n",
       "<text text-anchor=\"middle\" x=\"423.5\" y=\"-37.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">squared_error = 0.001</text>\n",
       "<text text-anchor=\"middle\" x=\"423.5\" y=\"-22.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 110</text>\n",
       "<text text-anchor=\"middle\" x=\"423.5\" y=\"-7.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = 0.028</text>\n",
       "</g>\n",
       "<!-- 4&#45;&gt;5 -->\n",
       "<g id=\"edge5\" class=\"edge\">\n",
       "<title>4&#45;&gt;5</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M423.5,-88.95C423.5,-80.72 423.5,-71.85 423.5,-63.48\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"427,-63.24 423.5,-53.24 420,-63.24 427,-63.24\"/>\n",
       "</g>\n",
       "<!-- 6 -->\n",
       "<g id=\"node7\" class=\"node\">\n",
       "<title>6</title>\n",
       "<path fill=\"#edaa79\" stroke=\"black\" d=\"M662,-53C662,-53 531,-53 531,-53 525,-53 519,-47 519,-41 519,-41 519,-12 519,-12 519,-6 525,0 531,0 531,0 662,0 662,0 668,0 674,-6 674,-12 674,-12 674,-41 674,-41 674,-47 668,-53 662,-53\"/>\n",
       "<text text-anchor=\"middle\" x=\"596.5\" y=\"-37.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">squared_error = 0.002</text>\n",
       "<text text-anchor=\"middle\" x=\"596.5\" y=\"-22.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">samples = 46</text>\n",
       "<text text-anchor=\"middle\" x=\"596.5\" y=\"-7.8\" font-family=\"Helvetica,sans-Serif\" font-size=\"14.00\">value = 0.154</text>\n",
       "</g>\n",
       "<!-- 4&#45;&gt;6 -->\n",
       "<g id=\"edge6\" class=\"edge\">\n",
       "<title>4&#45;&gt;6</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M484.01,-88.95C502.34,-78.93 522.4,-67.98 540.43,-58.13\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"542.56,-60.95 549.66,-53.09 539.2,-54.81 542.56,-60.95\"/>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<graphviz.files.Source at 0x7fbfb925c760>"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# extra code – we've already seen how to use export_graphviz()\n",
    "export_graphviz(\n",
    "    tree_reg,\n",
    "    out_file=str(IMAGES_PATH / \"regression_tree.dot\"),\n",
    "    feature_names=[\"x1\"],\n",
    "    rounded=True,\n",
    "    filled=True\n",
    ")\n",
    "Source.from_file(IMAGES_PATH / \"regression_tree.dot\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DecisionTreeRegressor(max_depth=3, random_state=42)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree_reg2 = DecisionTreeRegressor(max_depth=3, random_state=42)\n",
    "tree_reg2.fit(X_quad, y_quad)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.30265072, -0.40830374, -2.        , -2.        ,  0.27175756,\n",
       "       -2.        , -2.        ])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree_reg.tree_.threshold"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.30265072, -0.40830374, -0.45416115, -2.        , -2.        ,\n",
       "       -0.37022041, -2.        , -2.        ,  0.27175756, -0.21270403,\n",
       "       -2.        , -2.        ,  0.40399227, -2.        , -2.        ])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree_reg2.tree_.threshold"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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OnSfNBIxG7WDBg2ivb2daDTaJ69bt25lv/32S1omITdobGwMOguCDVpbWwF7utU4bpwx69CFHZY1M55OIrkUcz1VGQTBKTmhl9EorQBF4fK6DVduQoStOL5xA8zkoxoX5Ztu6jswzvW0bbJs2TK6urqora1l//33Z/jw4axYsWKfJe4jHGfz5s19fu/evZsdO3bwmc98xpV83XLLLZSUlKRdDj300J79J0yYQDQa5Z133ulznjfffJMJEya4kidBEDITn9nMlm7Fv+aYXoIzaWaqGdSCjLluF5kFTihIolHWgLhA5AqZZoTrQyTCSoC2NmOGI7Kb3cRW2jbYunUrP/zhDxk7diynnnoqSikWLFhAZWVlRqPx2WefZceOHT1uEI8//jhKKWpqagB6/G3Nvbp2sOsCccIJJzBgwAD+9Kc/8aMf/QiAXbt2sWTJEom1mePEQ0XFZzgSwk1DQwNNTU22dGtlRwcA1bG/kFkz4+kk4pVeekGqMvhNU1MTp556ah/XNyE3yQm97O6mAWgSAzg3sBXHNxKhBuCf/0THVmUjym7EEO7q6urpxW1vb2flypXcfffd7Nq1i7///e9EIhGmTJnC6aefzpQpU/jhD3/I5z73ObZv387q1avZs2cP8+fP7zlfeXk5X/7yl/n+97/PRx99xPe//33OPfdcDj/8cICeQXCLFi1i+vTp7LfffkycONFyfocNG2ZrhHS/fv24/vrrmTt3LoMGDWLChAncfvvtdHd3c/XVV1s+jxA+4i9VcX9uIdzEDTo7ulUT0yZtMoAzaWYqwzHomOt2SCxDXV0dLS0tlJaWUlRUxODBg5k8eTLXXnutawbNAw88wK233rrP1zK32Lx5M9dddx0vvPACW7ZsYejQoVx66aVcf/31MhbDB3JCL6NRmkB6gHMJy8GZk9zURFEGmD/fukBnGxh627Zt1NbWopRiwIABjB07losuuoirr76aoUOHAoZP7eOPP868efNYuHAh69atY//99+eoo47ax4icPn06/fv359JLL2XHjh2cddZZ3H333T3bR40axS9+8QvuvPNOfvnLX3LwwQf3RGzwiuuvv57u7m7mz5/Pli1bqKmp4dlnn2XIkCGepisUDm4MrsqVAVpOqa+v7/FDtK1b11wD3/62cWz//myp6mTn3hL60w5nwae6PxWlnZQPH0z9jh003n9/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\n",
      "text/plain": [
       "<Figure size 720x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# extra code – this cell generates and saves Figure 6–5\n",
    "\n",
    "def plot_regression_predictions(tree_reg, X, y, axes=[-0.5, 0.5, -0.05, 0.25]):\n",
    "    x1 = np.linspace(axes[0], axes[1], 500).reshape(-1, 1)\n",
    "    y_pred = tree_reg.predict(x1)\n",
    "    plt.axis(axes)\n",
    "    plt.xlabel(\"$x_1$\")\n",
    "    plt.plot(X, y, \"b.\")\n",
    "    plt.plot(x1, y_pred, \"r.-\", linewidth=2, label=r\"$\\hat{y}$\")\n",
    "\n",
    "fig, axes = plt.subplots(ncols=2, figsize=(10, 4), sharey=True)\n",
    "plt.sca(axes[0])\n",
    "plot_regression_predictions(tree_reg, X_quad, y_quad)\n",
    "\n",
    "th0, th1a, th1b = tree_reg.tree_.threshold[[0, 1, 4]]\n",
    "for split, style in ((th0, \"k-\"), (th1a, \"k--\"), (th1b, \"k--\")):\n",
    "    plt.plot([split, split], [-0.05, 0.25], style, linewidth=2)\n",
    "plt.text(th0, 0.16, \"Depth=0\", fontsize=15)\n",
    "plt.text(th1a + 0.01, -0.01, \"Depth=1\", horizontalalignment=\"center\", fontsize=13)\n",
    "plt.text(th1b + 0.01, -0.01, \"Depth=1\", fontsize=13)\n",
    "plt.ylabel(\"$y$\", rotation=0)\n",
    "plt.legend(loc=\"upper center\", fontsize=16)\n",
    "plt.title(\"max_depth=2\")\n",
    "\n",
    "plt.sca(axes[1])\n",
    "th2s = tree_reg2.tree_.threshold[[2, 5, 9, 12]]\n",
    "plot_regression_predictions(tree_reg2, X_quad, y_quad)\n",
    "for split, style in ((th0, \"k-\"), (th1a, \"k--\"), (th1b, \"k--\")):\n",
    "    plt.plot([split, split], [-0.05, 0.25], style, linewidth=2)\n",
    "for split in th2s:\n",
    "    plt.plot([split, split], [-0.05, 0.25], \"k:\", linewidth=1)\n",
    "plt.text(th2s[2] + 0.01, 0.15, \"Depth=2\", fontsize=13)\n",
    "plt.title(\"max_depth=3\")\n",
    "\n",
    "save_fig(\"tree_regression_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# extra code – this cell generates and saves Figure 6–6\n",
    "\n",
    "tree_reg1 = DecisionTreeRegressor(random_state=42)\n",
    "tree_reg2 = DecisionTreeRegressor(random_state=42, min_samples_leaf=10)\n",
    "tree_reg1.fit(X_quad, y_quad)\n",
    "tree_reg2.fit(X_quad, y_quad)\n",
    "\n",
    "x1 = np.linspace(-0.5, 0.5, 500).reshape(-1, 1)\n",
    "y_pred1 = tree_reg1.predict(x1)\n",
    "y_pred2 = tree_reg2.predict(x1)\n",
    "\n",
    "fig, axes = plt.subplots(ncols=2, figsize=(10, 4), sharey=True)\n",
    "\n",
    "plt.sca(axes[0])\n",
    "plt.plot(X_quad, y_quad, \"b.\")\n",
    "plt.plot(x1, y_pred1, \"r.-\", linewidth=2, label=r\"$\\hat{y}$\")\n",
    "plt.axis([-0.5, 0.5, -0.05, 0.25])\n",
    "plt.xlabel(\"$x_1$\")\n",
    "plt.ylabel(\"$y$\", rotation=0)\n",
    "plt.legend(loc=\"upper center\")\n",
    "plt.title(\"No restrictions\")\n",
    "\n",
    "plt.sca(axes[1])\n",
    "plt.plot(X_quad, y_quad, \"b.\")\n",
    "plt.plot(x1, y_pred2, \"r.-\", linewidth=2, label=r\"$\\hat{y}$\")\n",
    "plt.axis([-0.5, 0.5, -0.05, 0.25])\n",
    "plt.xlabel(\"$x_1$\")\n",
    "plt.title(f\"min_samples_leaf={tree_reg2.min_samples_leaf}\")\n",
    "\n",
    "save_fig(\"tree_regression_regularization_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Sensitivity to axis orientation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Rotating the dataset also leads to completely different decision boundaries:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# extra code – this cell generates and saves Figure 6–7\n",
    "\n",
    "np.random.seed(6)\n",
    "X_square = np.random.rand(100, 2) - 0.5\n",
    "y_square = (X_square[:, 0] > 0).astype(np.int64)\n",
    "\n",
    "angle = np.pi / 4  # 45 degrees\n",
    "rotation_matrix = np.array([[np.cos(angle), -np.sin(angle)],\n",
    "                            [np.sin(angle), np.cos(angle)]])\n",
    "X_rotated_square = X_square.dot(rotation_matrix)\n",
    "\n",
    "tree_clf_square = DecisionTreeClassifier(random_state=42)\n",
    "tree_clf_square.fit(X_square, y_square)\n",
    "tree_clf_rotated_square = DecisionTreeClassifier(random_state=42)\n",
    "tree_clf_rotated_square.fit(X_rotated_square, y_square)\n",
    "\n",
    "fig, axes = plt.subplots(ncols=2, figsize=(10, 4), sharey=True)\n",
    "plt.sca(axes[0])\n",
    "plot_decision_boundary(tree_clf_square, X_square, y_square,\n",
    "                       axes=[-0.7, 0.7, -0.7, 0.7], cmap=\"Pastel1\")\n",
    "plt.sca(axes[1])\n",
    "plot_decision_boundary(tree_clf_rotated_square, X_rotated_square, y_square,\n",
    "                       axes=[-0.7, 0.7, -0.7, 0.7], cmap=\"Pastel1\")\n",
    "plt.ylabel(\"\")\n",
    "\n",
    "save_fig(\"sensitivity_to_rotation_plot\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DecisionTreeClassifier(max_depth=2, random_state=42)"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.decomposition import PCA\n",
    "from sklearn.pipeline import make_pipeline\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "pca_pipeline = make_pipeline(StandardScaler(), PCA())\n",
    "X_iris_rotated = pca_pipeline.fit_transform(X_iris)\n",
    "tree_clf_pca = DecisionTreeClassifier(max_depth=2, random_state=42)\n",
    "tree_clf_pca.fit(X_iris_rotated, y_iris)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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MW3aVA4c8F71AKhYsSLXX38Ts2fPBOD48eO8++58Bg4cAsCWLd9z7Ngxrr76ck47rVruY9q0qezY8VO+e3XqFJ/v+fDhI5g/fy5dunRg7Nj7Wb78c59xbNz4DbGxsbnJS0E//riF8867IN+x88+/kH379nH48OFC1//wwxYqVKjAueeel3usZs2anHnmWfzww/f53n+HDmf7jEvcL2/1JUdOFUacoQqMiBRS3Kwdj8fD++9/xOrVq1i69CPeeONVHn44gY8//pz27Tt4/ZyBA4fQo8f57Nu3j7VrV5Oens4111wLZPXDAMyf/1/i4uLyfV7FivlnPhWM7bLLrmDr1t18+OEHfPrpMq699kr697+BV155vVAMRfWy5Jw3xng95+14UffLe31UVBQej6fI1xZ3W5+8Prf6kiM9I511yescikiUwIhImRhjOPfc8zj33PMYN+4ROnY8k3nz5vhMYLp2PYfmzVswd+4sVq9eyVVX9aNatWoAtGnTlqioKPbs2U3PnheXOpY6deowePBQBg8eymWXXcFf/jKQF198qVAV6eyzO7F//35++GGL1yrMGWe05auvvsh37KuvvqBhw0ZeZ2C1adOWzMxMVq1amTuEdPjwYTZv/pa//OXWUr+P8mrXyfcwnpTPkuFLvB5PTUvlhhk3aFq1A5TAiLhE/freG3br1w9+LMVZvXoVn3yylN69L6Nevfps3PgNycl7adOmbZGfN2DAYF5/fTq7d+9i7twFucerV6/OfffdT0LC/Vhr6datO0eOHGHNmlUYU4Fhw4b7vOdjjz1Cx46daNv2TE6ePMl77yXRrFlzr0NgF198CV27nsOAAdfxzDOTOf30Vvz003b++OMoV1/dj/vu+zsXXNCF8eP/wYABg/j667UkJj7L448/5fW1Tz+9JVdddQ0jR97JlCnTqFWrFo8+Oo7q1WswYMCgEn41/Wfx2sVBf81Il3datRp6g0s9MCIusXs3HDtW+LF7t9ORFVazZk1WrvyS/v370q5dS8aM+TsJCQ8zaNCQIj9v4MAhbN36IzVr1uSSS3rnO/ePf4znoYf+wb/+NYmOHc/kyit7s2DBfJo2bVbkPaOionj00XF06dKBnj0vIC0tjaSk/3q9tkKFCrz33gecd94F3HrrEM4+uw333z86d62bjh078fbb83j33fl06tSOhx4ay/33j2XE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\n",
      "text/plain": [
       "<Figure size 576x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# extra code – this cell generates and saves Figure 6–8\n",
    "\n",
    "plt.figure(figsize=(8, 4))\n",
    "\n",
    "axes = [-2.2, 2.4, -0.6, 0.7]\n",
    "z0s, z1s = np.meshgrid(np.linspace(axes[0], axes[1], 100),\n",
    "                       np.linspace(axes[2], axes[3], 100))\n",
    "X_iris_pca_all = np.c_[z0s.ravel(), z1s.ravel()]\n",
    "y_pred = tree_clf_pca.predict(X_iris_pca_all).reshape(z0s.shape)\n",
    "\n",
    "plt.contourf(z0s, z1s, y_pred, alpha=0.3, cmap=custom_cmap)\n",
    "for idx, (name, style) in enumerate(zip(iris.target_names, (\"yo\", \"bs\", \"g^\"))):\n",
    "    plt.plot(X_iris_rotated[:, 0][y_iris == idx],\n",
    "             X_iris_rotated[:, 1][y_iris == idx],\n",
    "             style, label=f\"Iris {name}\")\n",
    "\n",
    "plt.xlabel(\"$z_1$\")\n",
    "plt.ylabel(\"$z_2$\", rotation=0)\n",
    "th1, th2 = tree_clf_pca.tree_.threshold[[0, 2]]\n",
    "plt.plot([th1, th1], axes[2:], \"k-\", linewidth=2)\n",
    "plt.plot([th2, th2], axes[2:], \"k--\", linewidth=2)\n",
    "plt.text(th1 - 0.01, axes[2] + 0.05, \"Depth=0\",\n",
    "         horizontalalignment=\"right\", fontsize=15)\n",
    "plt.text(th2 - 0.01, axes[2] + 0.05, \"Depth=1\",\n",
    "         horizontalalignment=\"right\", fontsize=13)\n",
    "plt.axis(axes)\n",
    "plt.legend(loc=(0.32, 0.67))\n",
    "save_fig(\"pca_preprocessing_plot\")\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Decision Trees Have High Variance"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We've seen that small changes in the dataset (such as a rotation) may produce a very different Decision Tree.\n",
    "Now let's show that training the same model on the same data may produce a very different model every time, since the CART training algorithm used by Scikit-Learn is stochastic. To show this, we will set `random_state` to a different value than earlier:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DecisionTreeClassifier(max_depth=2, random_state=40)"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree_clf_tweaked = DecisionTreeClassifier(max_depth=2, random_state=40)\n",
    "tree_clf_tweaked.fit(X_iris, y_iris)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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kcIvYALjnPvN+zGUkmuRmNq9excPP3wb9eqdSOfOPTAzXnjhMcqWLRfwh/63337Kvn17sx8jffTRFMyMli3bA54eFSBXr0ooQn2E1K5dJ8qXT2HmzLe54YZRABw4sJ/PP3+fSy4ZWqAYRETiXahvo+6Fp5ekAXC2c26DmV0FrHXOfR6JAEUCOXLkSHal0d69e/j554X8978TOHhwP5MmfURSUhJduvSka9ezueyynlxzzW00btycPXt2s3z5EjIyDnLrraOz2ytVqjRXXHEuQ4f+i23btjB69L84++yLaNSoGUD2IN7XX3+O8867hNKly9C0aYug461e/QSqVw84eXW25ORSXHvt7Tz55P1UqFApeyK7zMxM/v73gE9vRUQSUihvo74UeBZ4AeiOd/wKnoG8twJKYCQm9uz5g759T8PMKFcuhXr1TqRPn8FcfvkN2bPUmhkTJkzhmWce4uWXn2Dz5vVUqFCZZs1aH5MEnHfeJZQrV57bbruS/fv30qPHBTzwwITs7bVq1eWOO8YwadJ4XnnlSdLSamU/7omU6667nczMTCZMGM3//reTFi3a83//9ympqdUjel4RkcLKXKBpLrN2NPsBGO2ce8PM9gCtnHNrzKwV8IlzLib/J23Zsr2bPn1BLE4tCahz53r06tWPO+8cE+tQRESKvPr1baFzrr2vbaGMa2kEfO9j/V4gpSCBiYiIiBREKAnMZqCxj/VdgdXhCUdEREQksFAG8U4ExnsH7QLUNrMuwCPAveEOTCQWIj2WRUREwiPoBMY594iZVQA+xfP6gC+ADGCMc+7pCMUnIiIicoygB/FmH2BWBmiG5/HTMufc3kgEFkI8eheSiIhIYir4IF4zK2NmT5vZJjPbhqeMep1zbl6skxcREREpmoJ5hPRv4HLgNeAgMBCYAPw1cmEFr127lsyb93GswxAREZEwS0rK/xUuwSQwfYErnXNvAJjZf4HvzCwpmHcgiYiIiIRbMGXUtYFvsr445+YBR4Dg50IXERERCaNgEpgkPG+dzukIIb5HSURERCRcgklCDPivmWXkWFcKeN7M9metcM5dEO7gRERERHwJJoF5xce6/4Y7EBEREZFgBUxgnHNDohGIiIiISLBCeReSiIiISKGgBEZERETijhIYERERiTtKYERERCTuaC4XiYn09CmsWzeajIxNJCfXpF69kVSv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\n",
      "text/plain": [
       "<Figure size 576x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# extra code – this cell generates and saves Figure 6–9\n",
    "\n",
    "plt.figure(figsize=(8, 4))\n",
    "y_pred = tree_clf_tweaked.predict(X_iris_all).reshape(lengths.shape)\n",
    "plt.contourf(lengths, widths, y_pred, alpha=0.3, cmap=custom_cmap)\n",
    "\n",
    "for idx, (name, style) in enumerate(zip(iris.target_names, (\"yo\", \"bs\", \"g^\"))):\n",
    "    plt.plot(X_iris[:, 0][y_iris == idx], X_iris[:, 1][y_iris == idx],\n",
    "             style, label=f\"Iris {name}\")\n",
    "\n",
    "th0, th1 = tree_clf_tweaked.tree_.threshold[[0, 2]]\n",
    "plt.plot([0, 7.2], [th0, th0], \"k-\", linewidth=2)\n",
    "plt.plot([0, 7.2], [th1, th1], \"k--\", linewidth=2)\n",
    "plt.text(1.8, th0 + 0.05, \"Depth=0\", verticalalignment=\"bottom\", fontsize=15)\n",
    "plt.text(2.3, th1 + 0.05, \"Depth=1\", verticalalignment=\"bottom\", fontsize=13)\n",
    "plt.xlabel(\"Petal length (cm)\")\n",
    "plt.ylabel(\"Petal width (cm)\")\n",
    "plt.axis([0, 7.2, 0, 3])\n",
    "plt.legend()\n",
    "save_fig(\"decision_tree_high_variance_plot\")\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Extra Material – Accessing the tree structure"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A trained `DecisionTreeClassifier` has a `tree_` attribute that stores the tree's structure:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<sklearn.tree._tree.Tree at 0x7fbfa8b563b0>"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree = tree_clf.tree_\n",
    "tree"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can get the total number of nodes in the tree:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree.node_count"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And other self-explanatory attributes are available:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree.max_depth"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree.max_n_classes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree.n_features"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree.n_outputs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree.n_leaves"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "All the information about the nodes is stored in NumPy arrays. For example, the impurity of each node:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.66666667, 0.        , 0.5       , 0.16803841, 0.04253308])"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree.impurity"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The root node is at index 0. The left and right children nodes of node _i_ are `tree.children_left[i]` and `tree.children_right[i]`. For example, the children of the root node are:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1, 2)"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree.children_left[0], tree.children_right[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "When the left and right nodes are equal, it means this is a leaf node (and the children node ids are arbitrary):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-1, -1)"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree.children_left[3], tree.children_right[3]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "So you can get the leaf node ids like this:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 3, 4])"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "is_leaf = (tree.children_left == tree.children_right)\n",
    "np.arange(tree.node_count)[is_leaf]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Non-leaf nodes are called _split nodes_. The feature they split is available via the `feature` array. Values for leaf nodes should be ignored:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0, -2,  1, -2, -2], dtype=int64)"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree.feature"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And the corresponding thresholds are:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 2.44999999, -2.        ,  1.75      , -2.        , -2.        ])"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree.threshold"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And the number of instances per class that reached each node is available too:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[50., 50., 50.]],\n",
       "\n",
       "       [[50.,  0.,  0.]],\n",
       "\n",
       "       [[ 0., 50., 50.]],\n",
       "\n",
       "       [[ 0., 49.,  5.]],\n",
       "\n",
       "       [[ 0.,  1., 45.]]])"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree.value"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([150,  50, 100,  54,  46], dtype=int64)"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree.n_node_samples"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.all(tree.value.sum(axis=(1, 2)) == tree.n_node_samples)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here's how you can compute the depth of each node:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0., 1., 1., 2., 2.])"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def compute_depth(tree_clf):\n",
    "    tree = tree_clf.tree_\n",
    "    depth = np.zeros(tree.node_count)\n",
    "    stack = [(0, 0)]\n",
    "    while stack:\n",
    "        node, node_depth = stack.pop()\n",
    "        depth[node] = node_depth\n",
    "        if tree.children_left[node] != tree.children_right[node]:\n",
    "            stack.append((tree.children_left[node], node_depth + 1))\n",
    "            stack.append((tree.children_right[node], node_depth + 1))\n",
    "    return depth\n",
    "\n",
    "depth = compute_depth(tree_clf)\n",
    "depth"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here's how to get the thresholds of all split nodes at depth 1:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1], dtype=int64)"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree_clf.tree_.feature[(depth == 1) & (~is_leaf)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1.75])"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tree_clf.tree_.threshold[(depth == 1) & (~is_leaf)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Exercise solutions"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. to 6."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. The depth of a well-balanced binary tree containing _m_ leaves is equal to log₂(_m_), rounded up. log₂ is the binary log; log₂(_m_) = log(_m_) / log(2). A binary Decision Tree (one that makes only binary decisions, as is the case with all trees in Scikit-Learn) will end up more or less well balanced at the end of training, with one leaf per training instance if it is trained without restrictions. Thus, if the training set contains one million instances, the Decision Tree will have a depth of log₂(10<sup>6</sup>) ≈ 20 (actually a bit more since the tree will generally not be perfectly well balanced).\n",
    "2. A node's Gini impurity is generally lower than its parent's. This is due to the CART training algorithm's cost function, which splits each node in a way that minimizes the weighted sum of its children's Gini impurities. However, it is possible for a node to have a higher Gini impurity than its parent, as long as this increase is more than compensated for by a decrease in the other child's impurity. For example, consider a node containing four instances of class A and one of class B. Its Gini impurity is 1 – (1/5)² – (4/5)² = 0.32. Now suppose the dataset is one-dimensional and the instances are lined up in the following order: A, B, A, A, A. You can verify that the algorithm will split this node after the second instance, producing one child node with instances A, B, and the other child node with instances A, A, A. The first child node's Gini impurity is 1 – (1/2)² – (1/2)² = 0.5, which is higher than its parent's. This is compensated for by the fact that the other node is pure, so its overall weighted Gini impurity is 2/5 × 0.5 + 3/5 × 0 = 0.2, which is lower than the parent's Gini impurity.\n",
    "3. If a Decision Tree is overfitting the training set, it may be a good idea to decrease `max_depth`, since this will constrain the model, regularizing it.\n",
    "4. Decision Trees don't care whether or not the training data is scaled or centered; that's one of the nice things about them. So if a Decision Tree underfits the training set, scaling the input features will just be a waste of time.\n",
    "5. The computational complexity of training a Decision Tree is _O_(_n_ × _m_ log₂(_m_)). So if you multiply the training set size by 10, the training time will be multiplied by _K_ = (_n_ × 10 _m_ × log₂(10 _m_)) / (_n_ × _m_ × log₂(_m_)) = 10 × log₂(10 _m_) / log₂(_m_). If _m_ = 10<sup>6</sup>, then _K_ ≈ 11.7, so you can expect the training time to be roughly 11.7 hours.\n",
    "6. If the number of features doubles, then the training time will also roughly double."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 7."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "_Exercise: train and fine-tune a Decision Tree for the moons dataset._"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "a. Generate a moons dataset using `make_moons(n_samples=10000, noise=0.4)`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Adding `random_state=42` to make this notebook's output constant:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import make_moons\n",
    "\n",
    "X_moons, y_moons = make_moons(n_samples=10000, noise=0.4, random_state=42)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "b. Split it into a training set and a test set using `train_test_split()`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(X_moons, y_moons,\n",
    "                                                    test_size=0.2,\n",
    "                                                    random_state=42)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "c. Use grid search with cross-validation (with the help of the `GridSearchCV` class) to find good hyperparameter values for a `DecisionTreeClassifier`. Hint: try various values for `max_leaf_nodes`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=3, estimator=DecisionTreeClassifier(random_state=42),\n",
       "             param_grid={'max_depth': [1, 2, 3, 4, 5, 6],\n",
       "                         'max_leaf_nodes': [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,\n",
       "                                            13, 14, 15, 16, 17, 18, 19, 20, 21,\n",
       "                                            22, 23, 24, 25, 26, 27, 28, 29, 30,\n",
       "                                            31, ...],\n",
       "                         'min_samples_split': [2, 3, 4]})"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "params = {\n",
    "    'max_leaf_nodes': list(range(2, 100)),\n",
    "    'max_depth': list(range(1, 7)),\n",
    "    'min_samples_split': [2, 3, 4]\n",
    "}\n",
    "grid_search_cv = GridSearchCV(DecisionTreeClassifier(random_state=42),\n",
    "                              params,\n",
    "                              cv=3)\n",
    "\n",
    "grid_search_cv.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DecisionTreeClassifier(max_depth=6, max_leaf_nodes=17, random_state=42)"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grid_search_cv.best_estimator_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "d. Train it on the full training set using these hyperparameters, and measure your model's performance on the test set. You should get roughly 85% to 87% accuracy."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "By default, `GridSearchCV` trains the best model found on the whole training set (you can change this by setting `refit=False`), so we don't need to do it again. We can simply evaluate the model's accuracy:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8595"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "y_pred = grid_search_cv.predict(X_test)\n",
    "accuracy_score(y_test, y_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 8."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "_Exercise: Grow a forest._"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "a. Continuing the previous exercise, generate 1,000 subsets of the training set, each containing 100 instances selected randomly. Hint: you can use Scikit-Learn's `ShuffleSplit` class for this."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import ShuffleSplit\n",
    "\n",
    "n_trees = 1000\n",
    "n_instances = 100\n",
    "\n",
    "mini_sets = []\n",
    "\n",
    "rs = ShuffleSplit(n_splits=n_trees, test_size=len(X_train) - n_instances,\n",
    "                  random_state=42)\n",
    "\n",
    "for mini_train_index, mini_test_index in rs.split(X_train):\n",
    "    X_mini_train = X_train[mini_train_index]\n",
    "    y_mini_train = y_train[mini_train_index]\n",
    "    mini_sets.append((X_mini_train, y_mini_train))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "b. Train one Decision Tree on each subset, using the best hyperparameter values found above. Evaluate these 1,000 Decision Trees on the test set. Since they were trained on smaller sets, these Decision Trees will likely perform worse than the first Decision Tree, achieving only about 80% accuracy."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.805671"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.base import clone\n",
    "\n",
    "forest = [clone(grid_search_cv.best_estimator_) for _ in range(n_trees)]\n",
    "\n",
    "accuracy_scores = []\n",
    "\n",
    "for tree, (X_mini_train, y_mini_train) in zip(forest, mini_sets):\n",
    "    tree.fit(X_mini_train, y_mini_train)\n",
    "    \n",
    "    y_pred = tree.predict(X_test)\n",
    "    accuracy_scores.append(accuracy_score(y_test, y_pred))\n",
    "\n",
    "np.mean(accuracy_scores)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "c. Now comes the magic. For each test set instance, generate the predictions of the 1,000 Decision Trees, and keep only the most frequent prediction (you can use SciPy's `mode()` function for this). This gives you _majority-vote predictions_ over the test set."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [],
   "source": [
    "Y_pred = np.empty([n_trees, len(X_test)], dtype=np.uint8)\n",
    "\n",
    "for tree_index, tree in enumerate(forest):\n",
    "    Y_pred[tree_index] = tree.predict(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy.stats import mode\n",
    "\n",
    "y_pred_majority_votes, n_votes = mode(Y_pred, axis=0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "d. Evaluate these predictions on the test set: you should obtain a slightly higher accuracy than your first model (about 0.5 to 1.5% higher). Congratulations, you have trained a Random Forest classifier!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.873"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "accuracy_score(y_test, y_pred_majority_votes.reshape([-1]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.6"
  },
  "nav_menu": {
   "height": "309px",
   "width": "468px"
  },
  "toc": {
   "navigate_menu": true,
   "number_sections": true,
   "sideBar": true,
   "threshold": 6,
   "toc_cell": false,
   "toc_section_display": "block",
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
